diff --git a/Http/HttpReply.cpp b/Http/HttpReply.cpp index 413e795..cfca56c 100644 --- a/Http/HttpReply.cpp +++ b/Http/HttpReply.cpp @@ -241,4 +241,49 @@ HttpReply HttpReply::StockReply(HttpReply::Status::type status) return reply; } +namespace Conversions { + +HttpReply::Status::type HttpReply(HttpServer::HttpReply::Status::type status) +{ + switch (status) + { + case HttpServer::HttpReply::Status::Ok: + return HttpReply::Status::Ok; + case HttpServer::HttpReply::Status::Created: + return HttpReply::Status::Created; + case HttpServer::HttpReply::Status::Accepted: + return HttpReply::Status::Accepted; + case HttpServer::HttpReply::Status::NoContent: + return HttpReply::Status::NoContent; + case HttpServer::HttpReply::Status::MultipleChoices: + return HttpReply::Status::MultipleChoices; + case HttpServer::HttpReply::Status::MovedPermanently: + return HttpReply::Status::MovedPermanently; + case HttpServer::HttpReply::Status::MovedTemporarily: + return HttpReply::Status::MovedTemporarily; + case HttpReply::Status::NotModified: + return HttpReply::Status::NotModified; + case HttpServer::HttpReply::Status::BadRequest: + return HttpReply::Status::BadRequest; + case HttpServer::HttpReply::Status::Unauthorized: + return HttpReply::Status::Unauthorized; + case HttpServer::HttpReply::Status::Forbidden: + return HttpReply::Status::Forbidden; + case HttpServer::HttpReply::Status::NotFound: + return HttpReply::Status::NotFound; + case HttpServer::HttpServer::HttpReply::Status::InternalServerError: + return HttpReply::Status::InternalServerError; + case HttpServer::HttpReply::Status::NotImplemented: + return HttpReply::Status::NotImplemented; + case HttpServer::HttpReply::Status::BadGateway: + return HttpReply::Status::BadGateway; + case HttpServer::HttpReply::Status::ServiceUnavailable: + return HttpReply::Status::ServiceUnavailable; + default: + return HttpReply::Status::InternalServerError; + } +} + +} // namespace Conversions + } // namespace Http diff --git a/Http/HttpReply.h b/Http/HttpReply.h index 761b2be..d1f1749 100644 --- a/Http/HttpReply.h +++ b/Http/HttpReply.h @@ -2,6 +2,7 @@ #define HTTP_HTTPREPLY_H #include "HttpHeaders.h" +#include "HttpServer.h" #include #include #include @@ -41,6 +42,12 @@ struct HttpReply static HttpReply StockReply(Status::type status); }; +namespace Conversions { + +HttpReply::Status::type HttpReply(HttpServer::HttpReply::Status::type status); + +} // namespace Conversions + } // namespace Http #endif // HTTP_HTTPREPLY_H diff --git a/Http/HttpRequestHandler.cpp b/Http/HttpRequestHandler.cpp index 726de46..a8f98cb 100644 --- a/Http/HttpRequestHandler.cpp +++ b/Http/HttpRequestHandler.cpp @@ -7,7 +7,7 @@ namespace Http { -HttpRequestHandler::HttpRequestHandler(std::function&)> callback) : +HttpRequestHandler::HttpRequestHandler(HttpServer::CallbackMethod callback) : m_callback(callback) { } @@ -21,15 +21,28 @@ HttpReply HttpRequestHandler::HandleRequest(const HttpRequest& request, const st if (requestPath.empty() || requestPath[0] != '/' || requestPath.find("..") != std::string::npos) return HttpReply::StockReply(HttpReply::Status::BadRequest); - if (!StringAlgorithm::iequals(request.uri, "/api") && !StringAlgorithm::istarts_with(request.uri, "/api/")) - return HttpReply::StockReply(HttpReply::Status::NotFound); + std::vector postData; + std::string boundary = request.headers.GetBoundary(); + if (!boundary.empty()) + { + postData = GetPostData(request.headers.GetBoundary(), data); + } + else + { + if (!data.empty()) + { + HttpPostData httpPostData; + httpPostData.name = "data"; + httpPostData.value = data; + postData.push_back(httpPostData); + } + } - std::vector postData = GetPostData(request.headers.GetBoundary(), data); - std::string answer = HandlePostData(request.uri.substr(4), postData); + HttpServer::HttpReply forwardReply = ForwardRequest(request.uri, postData); HttpReply reply; - reply.status = HttpReply::Status::Ok; - reply.content = answer; + reply.status = Conversions::HttpReply(forwardReply.status); + reply.content = forwardReply.content; reply.headers.resize(3); reply.headers[0].name = "Content-Length"; @@ -91,7 +104,7 @@ std::vector HttpRequestHandler::GetPostData(const std::string& bou return postDataCollection; } -std::string HttpRequestHandler::HandlePostData(const std::string& uri, const std::vector& postData) +HttpServer::HttpReply HttpRequestHandler::ForwardRequest(const std::string& uri, const std::vector& postData) { return m_callback(uri, postData); } diff --git a/Http/HttpRequestHandler.h b/Http/HttpRequestHandler.h index 9ad01cb..d156fcd 100644 --- a/Http/HttpRequestHandler.h +++ b/Http/HttpRequestHandler.h @@ -4,6 +4,7 @@ #include "HttpReply.h" #include "HttpRequest.h" #include "HttpPostData.h" +#include "HttpServer.h" #include #include #include @@ -14,7 +15,7 @@ namespace Http { class HttpRequestHandler { public: - explicit HttpRequestHandler(std::function&)> callback); + explicit HttpRequestHandler(HttpServer::CallbackMethod callback); HttpRequestHandler(const HttpRequestHandler&) = delete; @@ -22,12 +23,12 @@ public: private: std::vector GetPostData(const std::string& boundary, const std::string& data) const; - std::string HandlePostData(const std::string& uri, const std::vector& postData); + HttpServer::HttpReply ForwardRequest(const std::string& uri, const std::vector& postData); static bool URLDecode(const std::string& in, std::string& out); private: - std::function&)> m_callback; + HttpServer::CallbackMethod m_callback; }; } // namespace Http diff --git a/Http/HttpServer.cpp b/Http/HttpServer.cpp index ec72147..1d83de4 100644 --- a/Http/HttpServer.cpp +++ b/Http/HttpServer.cpp @@ -4,7 +4,7 @@ namespace Http { -HttpServer::HttpServer(unsigned short port, std::function&)> callback) : +HttpServer::HttpServer(unsigned short port, CallbackMethod callback) : m_pHttpServerImpl(new HttpServerImpl(port, callback)) { } diff --git a/Http/HttpServerImpl.cpp b/Http/HttpServerImpl.cpp index 7973c29..2eeb65d 100644 --- a/Http/HttpServerImpl.cpp +++ b/Http/HttpServerImpl.cpp @@ -7,7 +7,7 @@ namespace Http { -HttpServerImpl::HttpServerImpl(unsigned short port, std::function&)> callback) : +HttpServerImpl::HttpServerImpl(unsigned short port, HttpServer::CallbackMethod callback) : m_threadPoolSize(3), m_signals(m_ioService), m_acceptor(m_ioService), diff --git a/Http/HttpServerImpl.h b/Http/HttpServerImpl.h index c5b15eb..4ed10f6 100644 --- a/Http/HttpServerImpl.h +++ b/Http/HttpServerImpl.h @@ -15,7 +15,7 @@ namespace Http { class HttpServerImpl { public: - HttpServerImpl(unsigned short port, std::function&)> callback); + HttpServerImpl(unsigned short port, HttpServer::CallbackMethod callback); ~HttpServerImpl(); void Wait(); diff --git a/include/HttpServer.h b/include/HttpServer.h index 2a47ddf..c283b44 100644 --- a/include/HttpServer.h +++ b/include/HttpServer.h @@ -14,7 +14,40 @@ class HttpServerImpl; class HttpServer { public: - HttpServer(unsigned short port, std::function&)> callback); + struct HttpReply + { + struct Status + { + enum type + { + Ok = 200, + Created = 201, + Accepted = 202, + NoContent = 204, + MultipleChoices = 300, + MovedPermanently = 301, + MovedTemporarily = 302, + NotModified = 304, + BadRequest = 400, + Unauthorized = 401, + Forbidden = 403, + NotFound = 404, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceUnavailable = 503 + }; + }; + + Status::type status; + std::string content; + }; + +public: + typedef std::function&)> CallbackMethod; + +public: + HttpServer(unsigned short port, CallbackMethod callback); ~HttpServer(); void Wait();