#include "HttpReply.h" namespace Http { namespace StatusStrings { const std::string Ok = "HTTP/1.0 200 OK\r\n"; const std::string Created = "HTTP/1.0 201 Created\r\n"; const std::string Accepted = "HTTP/1.0 202 Accepted\r\n"; const std::string NoContent = "HTTP/1.0 204 No Content\r\n"; const std::string MultipleChoices = "HTTP/1.0 300 Multiple Choices\r\n"; const std::string MovedPermanently = "HTTP/1.0 301 Moved Permanently\r\n"; const std::string MovedTemporarily = "HTTP/1.0 302 Moved Temporarily\r\n"; const std::string NotModified = "HTTP/1.0 304 Not Modified\r\n"; const std::string BadRequest = "HTTP/1.0 400 Bad Request\r\n"; const std::string Unauthorized = "HTTP/1.0 401 Unauthorized\r\n"; const std::string Forbidden = "HTTP/1.0 403 Forbidden\r\n"; const std::string NotFound = "HTTP/1.0 404 Not Found\r\n"; const std::string InternalServerError = "HTTP/1.0 500 Internal Server Error\r\n"; const std::string NotImplemented = "HTTP/1.0 501 Not Implemented\r\n"; const std::string BadGateway = "HTTP/1.0 502 Bad Gateway\r\n"; const std::string ServiceUnavailable = "HTTP/1.0 503 Service Unavailable\r\n"; asio::const_buffer ToBuffer(HttpReply::Status::type status) { switch (status) { case HttpReply::Status::Ok: return asio::buffer(Ok); case HttpReply::Status::Created: return asio::buffer(Created); case HttpReply::Status::Accepted: return asio::buffer(Accepted); case HttpReply::Status::NoContent: return asio::buffer(NoContent); case HttpReply::Status::MultipleChoices: return asio::buffer(MultipleChoices); case HttpReply::Status::MovedPermanently: return asio::buffer(MovedPermanently); case HttpReply::Status::MovedTemporarily: return asio::buffer(MovedTemporarily); case HttpReply::Status::NotModified: return asio::buffer(NotModified); case HttpReply::Status::BadRequest: return asio::buffer(BadRequest); case HttpReply::Status::Unauthorized: return asio::buffer(Unauthorized); case HttpReply::Status::Forbidden: return asio::buffer(Forbidden); case HttpReply::Status::NotFound: return asio::buffer(NotFound); case HttpReply::Status::InternalServerError: return asio::buffer(InternalServerError); case HttpReply::Status::NotImplemented: return asio::buffer(NotImplemented); case HttpReply::Status::BadGateway: return asio::buffer(BadGateway); case HttpReply::Status::ServiceUnavailable: return asio::buffer(ServiceUnavailable); default: return asio::buffer(InternalServerError); } } } // namespace StatusStrings namespace miscellaneousStrings { const char nameValueSeparator[] = { ':', ' ' }; const char crlf[] = { '\r', '\n' }; } // namespace miscellaneousStrings std::vector HttpReply::ToBuffers() { std::vector buffers; buffers.push_back(StatusStrings::ToBuffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { HttpHeader& h = headers[i]; buffers.push_back(asio::buffer(h.name)); buffers.push_back(asio::buffer(miscellaneousStrings::nameValueSeparator)); buffers.push_back(asio::buffer(h.value)); buffers.push_back(asio::buffer(miscellaneousStrings::crlf)); } buffers.push_back(asio::buffer(miscellaneousStrings::crlf)); buffers.push_back(asio::buffer(content)); return buffers; } namespace StockReplies { const char Ok[] = ""; const char Created[] = "" "Created" "

201 Created

" ""; const char Accepted[] = "" "Accepted" "

202 Accepted

" ""; const char NoContent[] = "" "No Content" "

204 Content

" ""; const char MultipleChoices[] = "" "Multiple Choices" "

300 Multiple Choices

" ""; const char MovedPermanently[] = "" "Moved Permanently" "

301 Moved Permanently

" ""; const char MovedTemporarily[] = "" "Moved Temporarily" "

302 Moved Temporarily

" ""; const char NotModified[] = "" "Not Modified" "

304 Not Modified

" ""; const char BadRequest[] = "" "Bad Request" "

400 Bad Request

" ""; const char Unauthorized[] = "" "Unauthorized" "

401 Unauthorized

" ""; const char Forbidden[] = "" "Forbidden" "

403 Forbidden

" ""; const char NotFound[] = "" "Not Found" "

404 Not Found

" ""; const char InternalServerError[] = "" "Internal Server Error" "

500 Internal Server Error

" ""; const char NotImplemented[] = "" "Not Implemented" "

501 Not Implemented

" ""; const char BadGateway[] = "" "Bad Gateway" "

502 Bad Gateway

" ""; const char ServiceUnavailable[] = "" "Service Unavailable" "

503 Service Unavailable

" ""; std::string ToString(HttpReply::Status::type status) { switch (status) { case HttpReply::Status::Ok: return Ok; case HttpReply::Status::Created: return Created; case HttpReply::Status::Accepted: return Accepted; case HttpReply::Status::NoContent: return NoContent; case HttpReply::Status::MultipleChoices: return MultipleChoices; case HttpReply::Status::MovedPermanently: return MovedPermanently; case HttpReply::Status::MovedTemporarily: return MovedTemporarily; case HttpReply::Status::NotModified: return NotModified; case HttpReply::Status::BadRequest: return BadRequest; case HttpReply::Status::Unauthorized: return Unauthorized; case HttpReply::Status::Forbidden: return Forbidden; case HttpReply::Status::NotFound: return NotFound; case HttpReply::Status::InternalServerError: return InternalServerError; case HttpReply::Status::NotImplemented: return NotImplemented; case HttpReply::Status::BadGateway: return BadGateway; case HttpReply::Status::ServiceUnavailable: return ServiceUnavailable; default: return InternalServerError; } } } // namespace StockReplies HttpReply HttpReply::StockReply(HttpReply::Status::type status) { HttpReply reply; reply.status = status; reply.content = StockReplies::ToString(status); reply.headers.resize(2); reply.headers[0].name = "Content-Length"; reply.headers[0].value = std::to_string(reply.content.size()); reply.headers[1].name = "Content-Type"; reply.headers[1].value = "text/html"; return reply; } } // namespace Http