void HTTPRequestHandler::handleRequest() { int err = 0; switch (msg.request) { case HTTP_RT_GET: INFO("Dispatching GET Request."); err = handleGetRequest(); break; case HTTP_RT_POST: INFO("Dispatching POST request."); err = handlePostRequest(); break; case HTTP_RT_PUT: INFO("Dispatching PUT request."); err = handlePutRequest(); break; default: INFO("Error in handleRequest, unhandled request type."); err = HTTP_NotImplemented; break; } // if any of these functions returns a negative number, call the error handler if (err > 0) { handleError(err); } }
uint16_t handleRequest(char* req, cSocket* sock) { if(req == NULL || sock == NULL) return -1; if(strlen(req) == 0) return -1; // init buffer for requests char buffer[1024]; bzero(buffer,1024); uint16_t offset = 0; uint16_t bufferoffset = 0; while(offset < strlen(req) && req[offset] != '\0') { // copy request to buffer buffer[bufferoffset] = req[offset]; // if string is ended if(req[offset] == '\n' || req[offset] == '\0') { buffer[bufferoffset] = '\0'; // check what request is it and create header for request if(preg_match(buffer,"^GET[ ](.+)$") == 0) { uint16_t retcode = handleGetRequest(buffer,sock); if(retcode != HTTP_OK) forgeHeader(retcode,sock,""); return retcode; } else if(preg_match(buffer,"^POST[ ](.+)$") == 0) { uint16_t retcode = handlePostRequest(buffer,sock); if(retcode != HTTP_OK) forgeHeader(retcode,sock,""); return retcode; } else if(preg_match(buffer,"^PUT[ ](.+)$") == 0) { uint16_t retcode = handlePutRequest(buffer,sock); if(retcode != HTTP_OK) forgeHeader(retcode,sock,""); return retcode; } else { forgeHeader(HTTP_ERROR_NOT_IMPLEMENTED,sock,""); return HTTP_ERROR_NOT_IMPLEMENTED; } bzero(buffer,1024); bufferoffset = 0; } else bufferoffset++; offset++; } return 0; }