void CEclDirectEx::init(IPropertyTree *cfg, const char *process, const char *service) { StringBuffer xpath; xpath.appendf("Software/EspProcess[@name=\"%s\"]/EspService[@name=\"%s\"]", process, service); Owned<IPropertyTree> srvcfg = cfg->getPropTree(xpath.str()); if (!srvcfg) { IERRLOG("EclDirect: Configuration Error: unable to load configuration"); throw MakeStringException(-1, "EclDirect: Configuration Error: unable to load configuration"); } srvcfg->getProp("ClusterName", defaultCluster); defaultWait = srvcfg->getPropInt("WuTimeout", 60000); deleteWorkunits = cfg->getPropBool("DeleteWorkUnits", false); refreshValidClusters(); }
void CPooledHttpThread::threadmain() { TimeSection timing("CPooledHttpThread::threadmain()"); Owned<CEspHttpServer> httpserver; Owned<ISecureSocket> secure_sock; if(m_is_ssl && m_ssctx && m_persistentHandler == nullptr) { secure_sock.setown(m_ssctx->createSecureSocket(m_socket.getLink(), getEspLogLevel())); int res = 0; try { res = secure_sock->secure_accept(); if(res < 0) { return; } } catch(IException* e) { StringBuffer emsg; e->errorMessage(emsg); IERRLOG("%s", emsg.str()); return; } catch(...) { return; } m_socket.set(secure_sock); httpserver.setown(new CEspHttpServer(*m_socket, m_apport, false, getMaxRequestEntityLength())); } else { httpserver.setown(new CEspHttpServer(*m_socket, m_apport, false, getMaxRequestEntityLength())); } httpserver->setShouldClose(m_shouldClose); time_t t = time(NULL); initThreadLocal(sizeof(t), &t); bool keepAlive = false; try { ESP_TIME_SECTION("CPooledHttpThread::threadmain: httpserver->processRequest()"); httpserver->processRequest(); if (m_persistentHandler == nullptr) { keepAlive = !m_shouldClose && m_apport->queryProtocol()->persistentEnabled() && httpserver->persistentEligible(); if (keepAlive) m_apport->queryProtocol()->addPersistent(m_socket.get()); } else { keepAlive = !m_shouldClose && httpserver->persistentEligible(); m_persistentHandler->doneUsing(m_socket, keepAlive); } } catch (IException *e) { StringBuffer estr; IERRLOG("Exception(%d, %s) in CPooledHttpThread::threadmain().", e->errorCode(), e->errorMessage(estr).str()); e->Release(); } catch(...) { IERRLOG("General Exception - in CPooledHttpThread::threadmain()."); } clearThreadLocal(); try { if (m_socket != nullptr) { if (!keepAlive) m_socket->shutdown(SHUTDOWN_WRITE); m_socket.clear(); } } catch (IException *e) { StringBuffer estr; IERRLOG("Exception(%d, %s) - CPooledHttpThread::threadmain(), closing socket.", e->errorCode(), e->errorMessage(estr).str()); e->Release(); } catch(...) { IERRLOG("General Exception - CPooledHttpThread::threadmain(), closing socket."); } }
bool CSecureHttpProtocol::notifySelected(ISocket *sock,unsigned selected, IPersistentHandler* persistentHandler, bool shouldClose) { try { char name[256]; int port = sock->name(name, 255); CEspApplicationPort *apport = queryApplicationPort(port); if(apport == NULL) throw MakeStringException(-1, "binding not found!"); if(apport != NULL) { Owned<ISocket>accepted; if(persistentHandler == nullptr) accepted.setown(sock->accept()); else accepted.set(sock); if (accepted.get() != NULL) { char peername[256]; int port = accepted->peer_name(peername, 256); DBGLOG("HTTPS connection from %s:%d on %s socket", peername, port, persistentHandler?"persistent":"new"); if(m_ssctx != NULL) { if(m_maxConcurrentThreads > 0) { // Using Threading pool instead of generating one thread per request. void ** holder = new void*[7]; holder[0] = (void*)accepted.getLink(); holder[1] = (void*)apport; int maxEntityLength = getMaxRequestEntityLength(); holder[2] = (void*)&maxEntityLength; bool useSSL = true; holder[3] = (void*)&useSSL; holder[4] = (void*)m_ssctx.get(); holder[5] = (void*)persistentHandler; holder[6] = (void*)&shouldClose; http_thread_pool->start((void*)holder); delete [] holder; } else { /* create one thread per request */ CHttpThread *workthread = new CHttpThread(accepted.getLink(), apport, CEspProtocol::getViewConfig(), true, m_ssctx.get(), persistentHandler); workthread->setMaxRequestEntityLength(getMaxRequestEntityLength()); workthread->setShouldClose(shouldClose); workthread->start(); ESPLOG(LogMax, "Request processing thread started."); workthread->Release(); } } else { return false; } } } else { throw MakeStringException(-1, "can't acquire bindings IEspHttpBinding interface (via dynamic_cast)!"); } } catch (IException *e) { StringBuffer estr; IERRLOG("Exception(%d, %s) in CSecureHttpProtocol::notifySelected()", e->errorCode(), e->errorMessage(estr).str()); e->Release(); } catch(...) { IERRLOG("Unknown Exception in CSecureHttpProtocol::notifySelected()"); } return false; }
bool CHttpThread::onRequest() { keepAlive = false; ActiveRequests recording; Owned<CEspHttpServer> httpserver; Owned<ISecureSocket> secure_sock; if(m_is_ssl && m_ssctx && m_persistentHandler == nullptr) { ESPLOG(LogMax, "Creating secure socket"); secure_sock.setown(m_ssctx->createSecureSocket(m_socket.getLink(), getEspLogLevel())); int res = 0; try { ESPLOG(LogMax, "Accepting from secure socket"); res = secure_sock->secure_accept(); if(res < 0) { ESPLOG(LogMin, "Error accepting from secure socket"); return false; } } catch(IException* e) { StringBuffer emsg; e->errorMessage(emsg); IERRLOG("%s", emsg.str()); return false; } catch(...) { IERRLOG("Unknown exception accepting from secure socket"); return false; } ESPLOG(LogMax, "Request from secure socket"); m_socket.set(secure_sock); httpserver.setown(new CEspHttpServer(*secure_sock.get(), m_apport, m_viewConfig, getMaxRequestEntityLength())); } else { httpserver.setown(new CEspHttpServer(*m_socket, m_apport, m_viewConfig, getMaxRequestEntityLength())); } time_t t = time(NULL); initThreadLocal(sizeof(t), &t); httpserver->setIsSSL(m_is_ssl); httpserver->setShouldClose(m_shouldClose); httpserver->processRequest(); if (m_persistentHandler == nullptr) { keepAlive = !m_shouldClose && m_apport->queryProtocol()->persistentEnabled() && httpserver->persistentEligible(); if (keepAlive) m_apport->queryProtocol()->addPersistent(m_socket.get()); } else { keepAlive = !m_shouldClose && httpserver->persistentEligible(); m_persistentHandler->doneUsing(m_socket, keepAlive); } clearThreadLocal(); return false; }
bool CHttpProtocol::notifySelected(ISocket *sock,unsigned selected, IPersistentHandler* persistentHandler, bool shouldClose) { try { char name[256]; int port = sock->name(name, 255); CEspApplicationPort *apport = queryApplicationPort(port); if(apport == NULL) throw MakeStringException(-1, "binding not found!"); if(apport != NULL) { Owned<ISocket> accepted; if (persistentHandler == nullptr) accepted.setown(sock->accept()); else accepted.set(sock); if (accepted.get() != NULL) { char peername[256]; int port = accepted->peer_name(peername, 256); #if defined(_DEBUG) DBGLOG("HTTP connection from %s:%d on %s socket", peername, port, persistentHandler?"persistent":"new"); #endif if(m_maxConcurrentThreads > 0) { // Using Threading pool instead of generating one thread per request. void ** holder = new void*[7]; holder[0] = (void*)(accepted.getLink()); holder[1] = (void*)apport; int maxEntityLength = getMaxRequestEntityLength(); holder[2] = (void*)&maxEntityLength; bool useSSL = false; holder[3] = (void*)&useSSL; ISecureSocketContext* ctx = NULL; holder[4] = (void*)ctx; holder[5] = (void*)persistentHandler; holder[6] = (void*)&shouldClose; try { http_thread_pool->start((void*)holder, "", m_threadCreateTimeout > 0?m_threadCreateTimeout*1000:0); } catch(...) { IERRLOG("Error starting thread from http thread pool."); if(accepted.get()) { accepted->close(); //Assumption here is that if start() throws exception, that means the new //thread hasn't been started, so there's no other thread holding a link. CInterface* ci = dynamic_cast<CInterface*>(accepted.get()); if(ci && ci->IsShared()) accepted->Release(); } delete [] holder; throw; } delete [] holder; } else { /* create one thread per request */ CHttpThread *workthread = new CHttpThread(accepted.getLink(), apport, CEspProtocol::getViewConfig(), false, nullptr, persistentHandler); workthread->setMaxRequestEntityLength(getMaxRequestEntityLength()); workthread->setShouldClose(shouldClose); workthread->start(); workthread->Release(); } } } else { throw MakeStringException(-1, "can't acquire bindings IEspHttpBinding interface (via dynamic_cast)!"); } } catch (IException *e) { StringBuffer estr; IERRLOG("Exception(%d, %s) in CHttpProtocol::notifySelected()", e->errorCode(), e->errorMessage(estr).str()); e->Release(); } catch(...) { IERRLOG("Unknown Exception in CHttpProtocol::notifySelected()"); } return false; }