void HttpWorker::spawnConnection(Socket* client, ServerSocket* listener) { TRACE(1, "client connected; fd:%d", client->handle()); ++connectionLoad_; ++connectionCount_; // XXX since socket has not been used so far, I might be able to defer its creation out of its socket descriptor // XXX so that I do not have to double-initialize libev's loop handles for this socket. client->setLoop(loop_); HttpConnection* c; if (likely(freeConnections_ != nullptr)) { c = freeConnections_; c->id_ = connectionCount_; freeConnections_ = c->next_; c->reinitialize(); } else { c = new HttpConnection(this, connectionCount_/*id*/); } if (connections_) connections_->prev_ = c; c->next_ = connections_; connections_ = c; c->start(listener, client); }
void HttpWorker::spawnConnection(Socket* client, ServerSocket* listener) { TRACE("client connected; fd:%d", client->handle()); ++connectionLoad_; ++connectionCount_; // XXX since socket has not been used so far, I might be able to defer its creation out of its socket descriptor // XXX so that I do not have to double-initialize libev's loop handles for this socket. client->setLoop(loop_); HttpConnection* c = new HttpConnection(this, connectionCount_/*id*/); connections_.push_front(c); ConnectionHandle i = connections_.begin(); c->start(listener, client, i); }
int HttpServer::run(void* runArg) { OsConnectionSocket* requestSocket = NULL; if (!mpServerSocket->isOk()) { OsSysLog::add( FAC_SIP, PRI_ERR, "HttpServer: port not ok" ); httpStatus = OS_PORT_IN_USE; } while(!isShuttingDown() && mpServerSocket->isOk()) { requestSocket = mpServerSocket->accept(); if(requestSocket) { if (mbPersistentConnection) { // Take this opportunity to check for any old HttpConnections that can be deleted int items = mpHttpConnectionList->entries(); if (items != 0) { int deleted = 0; UtlSListIterator iterator(*mpHttpConnectionList); HttpConnection* connection; while ((connection = dynamic_cast<HttpConnection*>(iterator()))) { if (connection->toBeDeleted()) { OsSysLog::add(FAC_SIP, PRI_DEBUG, "HttpServer: destroying connection %p", connection); mpHttpConnectionList->destroy(connection); ++deleted; if (mHttpConnections > 0) { --mHttpConnections; } } } items = mpHttpConnectionList->entries(); OsSysLog::add(FAC_SIP, PRI_DEBUG, "HttpServer: " "destroyed %d inactive HttpConnections, %d remaining", deleted, items); } // Create new persistent connection if (mHttpConnections < MAX_PERSISTENT_HTTP_CONNECTIONS) { ++mHttpConnections; HttpConnection* newConnection = new HttpConnection(requestSocket, this); mpHttpConnectionList->append(newConnection); OsSysLog::add(FAC_SIP, PRI_INFO, "HttpServer::run starting persistent connection %d (%p)", mHttpConnections, newConnection); newConnection->start(); } else { OsSysLog::add(FAC_SIP, PRI_ERR, "HttpServer::run exceeded persistent connection limit (%d):" " sending 503", MAX_PERSISTENT_HTTP_CONNECTIONS); HttpMessage request; HttpMessage response; // Read the http request from the socket request.read(requestSocket); // Send out-of-resources message response.setResponseFirstHeaderLine(HTTP_PROTOCOL_VERSION, HTTP_OUT_OF_RESOURCES_CODE, HTTP_OUT_OF_RESOURCES_TEXT); response.write(requestSocket); requestSocket->close(); delete requestSocket; requestSocket = NULL; } } else { HttpMessage request; // Read a http request from the socket request.read(requestSocket); UtlString remoteIp; requestSocket->getRemoteHostIp(&remoteIp); HttpMessage* response = NULL; // If request from Valid IP Address if( processRequestIpAddr(remoteIp, request, response)) { // If the request is authorized processRequest(request, response, requestSocket); } if(response) { response->write(requestSocket); delete response; response = NULL; } requestSocket->close(); delete requestSocket; requestSocket = NULL; } } else { httpStatus = OS_PORT_IN_USE; } } // while (!isShuttingDown && mpServerSocket->isOk()) if ( !isShuttingDown() ) { OsSysLog::add( FAC_SIP, PRI_ERR, "HttpServer: exit due to port failure" ); } httpStatus = OS_TASK_NOT_STARTED; return(TRUE); }