|
|
|
@ -5,7 +5,10 @@
|
|
|
|
|
|
|
|
|
|
#include "webcc/logger.h"
|
|
|
|
|
#include "webcc/url.h"
|
|
|
|
|
#include "webcc/zlib_wrapper.h"
|
|
|
|
|
|
|
|
|
|
#if WEBCC_ENABLE_GZIP
|
|
|
|
|
#include "webcc/gzip.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
namespace webcc {
|
|
|
|
|
|
|
|
|
@ -15,12 +18,11 @@ bool RestRequestHandler::Bind(RestServicePtr service, const std::string& url,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RestRequestHandler::HandleConnection(ConnectionPtr connection) {
|
|
|
|
|
RequestPtr http_request = connection->request();
|
|
|
|
|
assert(http_request);
|
|
|
|
|
RequestPtr request = connection->request();
|
|
|
|
|
|
|
|
|
|
const Url& url = http_request->url();
|
|
|
|
|
const Url& url = request->url();
|
|
|
|
|
|
|
|
|
|
RestRequest rest_request{ http_request };
|
|
|
|
|
RestRequest rest_request{ request };
|
|
|
|
|
|
|
|
|
|
// Get service by URL path.
|
|
|
|
|
std::string path = "/" + url.path();
|
|
|
|
@ -35,29 +37,34 @@ void RestRequestHandler::HandleConnection(ConnectionPtr connection) {
|
|
|
|
|
RestResponse rest_response;
|
|
|
|
|
service->Handle(rest_request, &rest_response);
|
|
|
|
|
|
|
|
|
|
auto http_response = std::make_shared<Response>(rest_response.status);
|
|
|
|
|
auto response = std::make_shared<Response>(rest_response.status);
|
|
|
|
|
|
|
|
|
|
if (!rest_response.content.empty()) {
|
|
|
|
|
if (!rest_response.media_type.empty()) {
|
|
|
|
|
http_response->SetContentType(rest_response.media_type,
|
|
|
|
|
rest_response.charset);
|
|
|
|
|
response->SetContentType(rest_response.media_type, rest_response.charset);
|
|
|
|
|
}
|
|
|
|
|
SetContent(request, response, std::move(rest_response.content));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Only support gzip for response compression.
|
|
|
|
|
if (rest_response.content.size() > kGzipThreshold &&
|
|
|
|
|
http_request->AcceptEncodingGzip()) {
|
|
|
|
|
std::string compressed;
|
|
|
|
|
if (Compress(rest_response.content, &compressed)) {
|
|
|
|
|
http_response->SetHeader(headers::kContentEncoding, "gzip");
|
|
|
|
|
http_response->SetContent(std::move(compressed), true);
|
|
|
|
|
// Send response back to client.
|
|
|
|
|
connection->SendResponse(response);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
http_response->SetContent(std::move(rest_response.content), true);
|
|
|
|
|
|
|
|
|
|
void RestRequestHandler::SetContent(RequestPtr request, ResponsePtr response,
|
|
|
|
|
std::string&& content) {
|
|
|
|
|
#if WEBCC_ENABLE_GZIP
|
|
|
|
|
// Only support gzip (no deflate) for response compression.
|
|
|
|
|
if (content.size() > kGzipThreshold && request->AcceptEncodingGzip()) {
|
|
|
|
|
std::string compressed;
|
|
|
|
|
if (gzip::Compress(content, &compressed)) {
|
|
|
|
|
response->SetHeader(headers::kContentEncoding, "gzip");
|
|
|
|
|
response->SetContent(std::move(compressed), true);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif // WEBCC_ENABLE_GZIP
|
|
|
|
|
|
|
|
|
|
// Send response back to client.
|
|
|
|
|
connection->SendResponse(http_response);
|
|
|
|
|
response->SetContent(std::move(content), true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace webcc
|
|
|
|
|