diff options
Diffstat (limited to 'src/http1.cc')
| -rw-r--r-- | src/http1.cc | 58 |
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)); } |
