HTTPServer::HTTPServer(const std::string &addr, const std::string &port, int maxClientsCount, std::function<HTTPResponse(HTTPRequest &request)> onGet, std::function<HTTPResponse(HTTPRequest &request)> onPost, EpollHandler &epoll) { std::function<void(TCPSocket &)> onAccept = [&onGet, &onPost, this](TCPSocket &sock) { const int BUF_MAX_SIZE = 4096; char buf[BUF_MAX_SIZE]; int len; while (true) { len = sock.recieveMsg(buf, BUF_MAX_SIZE); if (len <= 0) break; addBufToString(currentRequest[sock.sockfd], buf, len); } std::cerr << " ======\n" << currentRequest[sock.sockfd] << "\n===========\n"; HTTPRequest httpRequest; HTTPResponse httpResponse; try { //std::cout << currentRequest << "\n"; httpRequest = HTTPRequest(currentRequest[sock.sockfd]); //std::cout << "Request from soket " << sock.sockfd << ": " << currentRequest << "\n"; if (httpRequest.getMethod() == "GET") { httpResponse = onGet(httpRequest); } else if (httpRequest.getMethod() == "POST") { httpResponse = onPost(httpRequest); } std::cout << "Response for socket " << sock.sockfd << ": \n"; sock.sendMsg(httpResponse.buildResponse().c_str()); currentRequest[sock.sockfd] = ""; } catch (NotFullRequestException &e) { std::cerr << "Not full request: " << e.getMessage() << "\n"; } catch (HTTPException &e) { std::cerr << "Bad HTTP Request: " << e.getMessage() << "\n"; httpResponse.setHttpVersion("HTTP/1.1"); httpResponse.setStatusCode(400); httpResponse.setReasonPhrase("Bad Request"); httpResponse.addEntityHeader("Content-Type", "*/*"); std::cout << "Response for socket " << sock.sockfd << ": \n"; sock.sendMsg(httpResponse.buildResponse().c_str()); currentRequest[sock.sockfd] = ""; } }; tcpServer = new TCPServer(addr.c_str(), port.c_str(), maxClientsCount * 2, onAccept, epoll); }
void SelPool::processHandler(ClientConnection *client) { printf("\nProcessing\n"); /** skip connection that has been closed */ if (client->isClosed()) { printf("Connection to client has been closed\n"); client->setState(ClientConnection::Closed); return; } switch( client->getRequest()->getState() ) { case HTTPRequest::Parsing: printf("Parsing ...\n"); break; case HTTPRequest::ParsedError: printf("ParseError\n"); case HTTPRequest::ParsedCorrect: { printf("Parsed\n"); /* build response for this client */ HTTPResponse *res = NULL; if ((res = client->getResponse()) == NULL) { printf( "Create new response\n"); res = client->createResponse(); res->buildResponse(client->getRequest()); } /* if it's CGI request, wait until the next select loop to write */ if (client->getRequest()->isCGIRequest()) { client->setState(ClientConnection::Writing_Response); break; } /* Dump HTTP response to send buffer */ ssize_t size, retSize; char *write_buf = client->getWriteBuffer_ForWrite(&size); printf("Write buffer has %d bytes free\n", size); int re = res->writeResponse(write_buf, size, &retSize); client->addWriteSize(retSize); if (re) { printf("All dumped\n"); client->setState(ClientConnection::Done_Response); //delete client->getResponse(); } else { printf("Not all dumped\n"); client->setState(ClientConnection::Writing_Response); } printf("------- Printing Response Buffer --------\n"); printf("%s", write_buf); break; } default: break; } return; }