uHTTP::HTTP::StatusCode TestDevice::httpRequestRecieved(HTTPRequest *httpReq) { ParameterList paramList; httpReq->getParameterList(paramList); for (int n=0; n<paramList.size(); n++) { Parameter *param = paramList.getParameter(n); cout << "["<< n << "] : "<< param->getName() << "= "<< param->getValue() << endl; } string uri; httpReq->getURI(uri); if (uri.find(PRESENTATION_URI) == string::npos) { return Device::httpRequestRecieved(httpReq); } string contents; contents = "<HTML><BODY><H1>"; contents += ""; contents += "</H1></BODY></HTML>"; HTTPResponse httpRes; httpRes.setStatusCode(HTTP::OK_REQUEST); httpRes.setContent(contents); return httpReq->post(&httpRes); }
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); }
uHTTP::HTTP::StatusCode HTTPSimpleRequestListener::httpRequestRecieved(HTTPRequest *httpReq) { if (httpReq->isGetRequest() == false) { return httpReq->returnBadRequest(); } std::string uri; httpReq->getURI(uri); if (uri.length() <= 0) { return httpReq->returnBadRequest(); } std::string msg = UHTTP_HTTP_SERVER_TEST_CONTENT; HTTPResponse httpRes; httpRes.setStatusCode(HTTP::OK_REQUEST); httpRes.setContent(msg); httpReq->post(&httpRes); return uHTTP::HTTP::OK_REQUEST; }
ClockDevice::ClockDevice() : Device(CLOCK_DESCRIPTION_FILE_NAME) #else ClockDevice::ClockDevice() : Device() #endif { #if !defined(USE_CLOCK_DESCRIPTION_FILE) loadDescription(CLOCK_DEVICE_DESCRIPTION); Service *timeService = getService("urn:schemas-upnp-org:service:timer:1"); timeService->loadSCPD(CLOCK_SERVICE_DESCRIPTION); #endif Action *getTimeAction = getAction("GetTime"); getTimeAction->setActionListener(this); Action *setTimeAction = getAction("SetTime"); setTimeAction->setActionListener(this); ServiceList *serviceList = getServiceList(); Service *service = serviceList->getService(0); service->setQueryListener(this); m_timeVar = getStateVariable("Time"); setLeaseTime(60); } //////////////////////////////////////////////// // ActionListener //////////////////////////////////////////////// bool ClockDevice::actionControlReceived(Action *action) { const char *actionName = action->getName(); if (strcmp("GetTime", actionName) == 0) { std::string dateStr; Clock clock; clock.toString(dateStr); Argument *timeArg = action->getArgument("CurrentTime"); timeArg->setValue(dateStr.c_str()); return true; } if (strcmp(actionName, "SetTime") == 0) { Argument *timeArg = action->getArgument("NewTime"); const char *newTime = timeArg->getValue(); Argument *resultArg = action->getArgument("Result"); std::ostringstream valbuf; valbuf << "Not implemented (" << newTime << ")"; resultArg->setValue(valbuf.str().c_str()); return true; } return false; } //////////////////////////////////////////////// // QueryListener //////////////////////////////////////////////// bool ClockDevice::queryControlReceived(StateVariable *stateVar) { const char *varName = stateVar->getName(); Clock clock; string clockVal; stateVar->setValue(clock.toString(clockVal)); return true; } //////////////////////////////////////////////// // HttpRequestListner //////////////////////////////////////////////// //void ClockDevice::httpRequestRecieved(HTTPRequest *httpReq) HTTP::StatusCode ClockDevice::httpRequestRecieved(HTTPRequest *httpReq) { ParameterList paramList; httpReq->getParameterList(paramList); for (int n=0; n<paramList.size(); n++) { Parameter *param = paramList.getParameter(n); cout << "[" << n << "] : " << param->getName() << " = " << param->getValue() << endl; } string uri; httpReq->getURI(uri); if (uri.find(CLOCK_PRESENTATION_URI) == string::npos) { Device::httpRequestRecieved(httpReq); return HTTP::OK_REQUEST; //return ; } string clockStr; Clock clock; clock.toString(clockStr); string contents; contents = "<HTML><BODY><H1>"; contents += clockStr; contents += "</H1></BODY></HTML>"; HTTPResponse httpRes; httpRes.setStatusCode(HTTP::OK_REQUEST); httpRes.setContent(contents); return httpReq->post(&httpRes) ? HTTP::OK_REQUEST : HTTP::INTERNAL_SERVER_ERROR; }
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(); }