void * StarServer(void * client) { http_request * request = CreateRequest(); int client_socket; client_socket = *(int *)client; int server_status; server_status = GetContent(client_socket, request->buf, HTTP_REQUEST_BUF_MAX_LENGTH); if(server_status) { if(server_status==-1) ReturnError(400,client_socket); if(server_status==-2) ReturnError(414,client_socket); } else { int analysis_status = 0; analysis_status = AnalysisRequest(request); if(analysis_status) ReturnError(analysis_status, client_socket); else HandleRequest(client_socket, request); } DestroyRequest(request); close(client_socket); return NULL; }
unsigned Listener::Process() { //Profile profile("Listener::Process"); //////////////////////////////////////// // handle inactive state (with UdpManager) if (!IsActive() && mTcpManager) { // check all connections to see if they are idle std::set<Connection *>::iterator iterator; for (iterator = mConnections.begin(); iterator != mConnections.end(); iterator++) { Connection * connection = *iterator; if (connection->IsConnected()) connection->Disconnect(); } // close the UdpManager if all the connections are closed if (!mConnectionCount) { mTcpManager->Release(); mTcpManager = 0; OnShutdown(); } } //////////////////////////////////////// // handle active state (without UdpManager) else if (IsActive() && !mTcpManager) { mParams = GetConnectionParams(); mActiveMax = GetActiveRequestMax(); mTcpManager = new TcpManager(mParams); mTcpManager->SetHandler(this); if (mTcpManager->BindAsServer()){ OnStartup(); }else{ OnFailedStartup(); return 0; } } //////////////////////////////////////// // process the TcpManager if (mTcpManager) { //Profile subProfile("TcpManager::GiveTime()"); mTcpManager->GiveTime(); } // check all closed connections to see if they are idle std::list<Connection *>::iterator closedIterator = mClosedConnections.begin(); while (closedIterator != mClosedConnections.end()) { //Profile profile("Listener::Process (cleanup connection)"); std::list<Connection *>::iterator current = closedIterator++; Connection * connection = *current; if (!connection->GetActiveRequests() && !connection->GetQueuedRequests()) { mClosedConnections.erase(current); mConnections.erase(connection); mConnectionCount--; OnConnectionDestroyed(connection); delete connection; } } //////////////////////////////////////// // process request queue while (!mQueuedRequests.empty() && (!mActiveMax || mActiveCount < mActiveMax)) { //Profile profile("Listener::Process (activate queued request)"); QueueNode & node = mQueuedRequests.front(); if (!IsActive()) { // If not active, discard queued request if (node.connection) { // normal request, internal requests have no connection node.connection->NotifyDiscardRequest(node.request); } DestroyRequest(node.request); } else { // Move request to active list if (node.connection) { // normal request, internal requests have no connection node.connection->NotifyBeginRequest(node.request); } mActiveRequests.push_back(node); mActiveCount++; } mQueuedRequests.pop_front(); } //////////////////////////////////////// // Process active requests unsigned requestsProcessed = 0; std::list<QueueNode>::iterator iterator = mActiveRequests.begin(); while (iterator != mActiveRequests.end()) { //Profile profile("Listener::Process (process request)"); std::list<QueueNode>::iterator current = iterator++; RequestBase * request = current->request; Connection * connection = current->connection; if (request->Process()) { if (connection) { // normal request, internal requests have no connection connection->NotifyEndRequest(request); } DestroyRequest(request); mActiveRequests.erase(current); mActiveCount--; } else if (mSleepingRequests.find(request) != mSleepingRequests.end()) { mActiveRequests.erase(current); } requestsProcessed++; } return requestsProcessed; }