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 LoginHTTPRequestHandler::createResponse(const HTTPRequest &r) { HTTPResponse response; QString page = "\r\n<html><body>" "<form method=\"POST\">" "%1" "Username: <input type=\"text\" name=\"username\">" "Password: <input type=\"password\" name=\"pass\">" "<INPUT type=\"submit\" value=\"Auth\">" "</form></body></html>"; if("GET" == r.method){ response.setStatusCode(200); response.setReasonPhrase("OK"); QList<QNetworkCookie> cookieList = QtConcurrent::blockingFiltered(r.cookieJar, [] (const QNetworkCookie &cookie) -> bool { return cookie.name() == "loggedin" && cookie.value() == "1"; } ); if(1 == cookieList.size()){ response.setBody("You're logged in!"); } else{ response.setBody(page.arg("")); } emit responseWritten(response); emit endOfWriting(); return; } if("POST" == r.method && !r.postData.isEmpty()){ if(r.postData.contains("username") && "Ion" == r.postData["username"] && r.postData.contains("pass") && "1234" == r.postData["pass"]){ response.setStatusCode(200); response.setReasonPhrase("OK"); //TODO: this could be something randomized in order to avoid replicating QNetworkCookie cookie("loggedin", "1"); cookie.setHttpOnly(true); response.setCookie(cookie); response.setBody("You're logged in!\n"); emit responseWritten(response); emit endOfWriting(); return; } response.setStatusCode(200); response.setReasonPhrase("OK"); response.setBody(page.arg("Login failed, try again!<br>")); emit responseWritten(response); emit endOfWriting(); return; } response.setStatusCode(400); response.setReasonPhrase("Bad request"); emit responseWritten(response); emit endOfWriting(); }