summaryrefslogtreecommitdiff
path: root/src/http1.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/http1.cc')
-rw-r--r--src/http1.cc58
1 files changed, 42 insertions, 16 deletions
diff --git a/src/http1.cc b/src/http1.cc
index b9a3401..4bd89aa 100644
--- a/src/http1.cc
+++ b/src/http1.cc
@@ -88,7 +88,7 @@ public:
const auto & __header_field = __iterate.first;
const auto & __header_value = __iterate.second;
- evbuffer_add_printf(__evbuffer_ptr.get(), "%s:%s\r\n",
+ evbuffer_add_printf(__evbuffer_ptr.get(), "%s: %s\r\n",
__header_field.c_str(), __header_value.c_str());
}
@@ -155,7 +155,7 @@ private:
class Http1Request : public HttpRequest
{
public:
- Http1Request();
+ explicit Http1Request(short major_version, short minor_version);
virtual ~Http1Request() = default;
virtual ssize_t ConstructFromMemory(const char * buf, size_t buflen);
@@ -344,7 +344,8 @@ int Http1RequestParserCallbacks::CallbackOnMessageComplete(http_parser * parser)
return 0;
}
-Http1Request::Http1Request()
+Http1Request::Http1Request(short major_version, short minor_version) :
+ major_version_(major_version), minor_version_(minor_version)
{
http_parser_init(parser_.get(), HTTP_REQUEST);
}
@@ -474,7 +475,29 @@ static const char * client_error_phrases[] = {
/* 414 */ "Request-URI Too Large",
/* 415 */ "Unsupported Media Type",
/* 416 */ "Requested range not satisfiable",
- /* 417 */ "Expectation Failed"
+ /* 417 */ "Expectation Failed",
+ /* 418 */ nullptr,
+ /* 419 */ nullptr,
+ /* 420 */ nullptr,
+ /* 421 */ "Misdirected Request",
+ /* 422 */ "Unprocessable Entity",
+ /* 423 */ "Locked",
+ /* 424 */ "Failed Dependency",
+ /* 425 */ nullptr,
+ /* 426 */ "Upgrade Required",
+ /* 427 */ nullptr,
+ /* 428 */ "Precondition Required",
+ /* 429 */ "Too Many Requests"
+};
+
+static const char * client_error_phrases_43x[] = {
+ /* 430 */ nullptr,
+ /* 431 */ "Request Header Fields Too Large"
+};
+
+static const char * client_error_phrases_45x[] = {
+ /* 450 */ nullptr,
+ /* 451 */ "Unavailable For Legal Reasons"
};
static const char * server_error_phrases[] = {
@@ -491,7 +514,9 @@ const char * __resp_code_to_str(int resp_code)
if (resp_code >= 101 && resp_code <= 102) return informational_phrases[resp_code - 101];
if (resp_code >= 200 && resp_code <= 206) return success_phrases[resp_code - 200];
if (resp_code >= 300 && resp_code <= 307) return redirection_phrases[resp_code - 300];
- if (resp_code >= 400 && resp_code <= 417) return client_error_phrases[resp_code - 400];
+ if (resp_code >= 400 && resp_code <= 429) return client_error_phrases[resp_code - 400];
+ if (resp_code >= 430 && resp_code <= 431) return client_error_phrases_43x[resp_code - 430];
+ if (resp_code >= 450 && resp_code <= 451) return client_error_phrases_45x[resp_code - 450];
if (resp_code >= 500 && resp_code <= 505) return server_error_phrases[resp_code - 500];
return nullptr;
@@ -874,7 +899,7 @@ void Http1Response::Construct()
/* 应答头部 */
headers_.ForEachHeader([this, evbuf_ptr](const std::string & str_field, const std::string & str_value)
{
- evbuffer_add_printf(evbuf_ptr, "%s:%s\r\n", str_field.c_str(), str_value.c_str());
+ evbuffer_add_printf(evbuf_ptr, "%s: %s\r\n", str_field.c_str(), str_value.c_str());
return true;
});
@@ -1158,27 +1183,27 @@ void Http1Connection::Write(std::unique_ptr<HttpSession> http_session)
if (request.Complete(HttpRequest::kSecionMessage))
{
auto stolen_buffer = request.StolenEvbuf();
- bufferevent_write_buffer(bev_upstream_, stolen_buffer.release());
+ bufferevent_write_buffer(bev_upstream_, stolen_buffer.get());
}
if (response.SectionState(response.kSectionMessage) == response.kStateComplete)
{
auto stolen_buffer = response.StolenEvBuf();
- bufferevent_write_buffer(bev_downstream_, stolen_buffer.release());
+ bufferevent_write_buffer(bev_downstream_, stolen_buffer.get());
}
return;
}
-std::unique_ptr<HttpRequest> HttpRequestFactory(int primary_version, int second_version)
+std::unique_ptr<HttpRequest> HttpRequestFactory(short major_version, short minor_version)
{
- if (primary_version == 1 && second_version == 0)
- return std::move(std::make_unique<Http1Request>());
- if (primary_version == 1 && second_version == 1)
- return std::move(std::make_unique<Http1Request>());
+ if (major_version == 1 && minor_version == 0)
+ return std::move(std::make_unique<Http1Request>(major_version, minor_version));
+ if (major_version == 1 && minor_version == 1)
+ return std::move(std::make_unique<Http1Request>(major_version, minor_version));
- assert(0);
- return nullptr;
+ throw std::invalid_argument(string_format("Invalid HTTP Version: %d, %d",
+ major_version, minor_version));
}
std::unique_ptr<HttpResponse> HttpResponseFactory(short major_version, short minor_version)
@@ -1188,6 +1213,7 @@ std::unique_ptr<HttpResponse> HttpResponseFactory(short major_version, short min
if (major_version == 1 && minor_version == 1)
return std::move(std::make_unique<Http1Response>(major_version, minor_version));
- return nullptr;
+ throw std::invalid_argument(string_format("Invalid HTTP Version: %d, %d",
+ major_version, minor_version));
}