HEAD support

This commit is contained in:
2019-06-19 19:20:10 +02:00
parent 0004064a27
commit d8cfca8fc5
5 changed files with 23 additions and 25 deletions

View File

@@ -26,8 +26,8 @@ namespace Http
std::string requestTypeString; std::string requestTypeString;
ss >> requestTypeString; ss >> requestTypeString;
request.requestType = ToEnum<HttpRequest::Type>(requestTypeString, HttpRequest::typeStrings); request.type = ToEnum<HttpRequest::Type>(requestTypeString, HttpRequest::typeStrings);
if (request.requestType == HttpRequest::Type::UNKNOWN) if (request.type == HttpRequest::Type::UNKNOWN)
{ {
throw std::runtime_error("Bad request type"); throw std::runtime_error("Bad request type");
} }

View File

@@ -6,7 +6,7 @@ namespace Http
{ {
struct Request struct Request
{ {
HttpRequest::Type requestType; HttpRequest::Type type;
Url url; Url url;
static Request Deserialize(std::vector<char> const & bytes); static Request Deserialize(std::vector<char> const & bytes);

View File

@@ -6,24 +6,28 @@ namespace Middleware
{ {
void NotFound::HandleRequest(Http::Request const & request, Http::Response & response) void NotFound::HandleRequest(Http::Request const & request, Http::Response & response)
{ {
if (response.code != HttpResponse::Code::UNKNOWN || request.requestType != HttpRequest::Type::GET) if (response.code != HttpResponse::Code::UNKNOWN &&
!(request.type == HttpRequest::Type::GET || request.type == HttpRequest::Type::HEAD))
{ {
return; return;
} }
response.code = HttpResponse::Code::NOT_FOUND; response.code = HttpResponse::Code::NOT_FOUND;
response.contentType = Http::GetMimeType(Http::FileType::HTML); if (request.type == HttpRequest::Type::GET)
{
std::stringstream ss; response.contentType = Http::GetMimeType(Http::FileType::HTML);
ss << "<!DOCTYPE html><html><head></head><body>";
ss << "<h1>404 - File Not Found</h1>"; std::stringstream ss;
ss << "<p>File: " << request.url.GetPath() << "<p>"; ss << "<!DOCTYPE html><html><head></head><body>";
ss << "</body></html>"; ss << "<h1>404 - File Not Found</h1>";
ss << "<p>File: " << request.url.GetPath() << "<p>";
ss << "</body></html>";
auto responseContent = ss.str(); auto responseContent = ss.str();
response.content.insert(response.content.begin(), response.content.insert(response.content.begin(),
responseContent.begin(), responseContent.begin(),
responseContent.end()); responseContent.end());
}
} }
NotFound::NotFound(Logger & _logger) NotFound::NotFound(Logger & _logger)

View File

@@ -50,15 +50,9 @@ namespace Middleware
void StaticContent::HandleRequest(Http::Request const & request, Http::Response & response) void StaticContent::HandleRequest(Http::Request const & request, Http::Response & response)
{ {
switch(request.requestType) if (!(request.type == HttpRequest::Type::GET || request.type == HttpRequest::Type::HEAD))
{ {
case HttpRequest::Type::GET: return;
break;
default:
{
return;
}
} }
std::string path; std::string path;
@@ -79,7 +73,7 @@ namespace Middleware
return; return;
} }
if (!TryReadAllBytes(path, response.content)) if (request.type == HttpRequest::Type::GET && !TryReadAllBytes(path, response.content))
{ {
return; return;
} }

View File

@@ -50,7 +50,7 @@ void ConnectionOperator::HandleNewConnection(ClientSocket const & newClient)
{ {
std::stringstream ss; std::stringstream ss;
ss << "Unhandled "; ss << "Unhandled ";
ss << HttpRequest::typeStrings[static_cast<int>(request.requestType)]; ss << HttpRequest::typeStrings[static_cast<int>(request.type)];
ss << " request for file <"; ss << " request for file <";
ss << request.url.GetPath(); ss << request.url.GetPath();
ss << '>'; ss << '>';