shrpx_https_upstream.cc: Code cleanup
This commit is contained in:
parent
a0326b3f2b
commit
dc0af2e074
|
@ -51,7 +51,7 @@ const size_t SHRPX_HTTPS_MAX_HEADER_LENGTH = 64*1024;
|
||||||
HttpsUpstream::HttpsUpstream(ClientHandler *handler)
|
HttpsUpstream::HttpsUpstream(ClientHandler *handler)
|
||||||
: handler_(handler),
|
: handler_(handler),
|
||||||
current_header_length_(0),
|
current_header_length_(0),
|
||||||
downstream_(0),
|
downstream_(nullptr),
|
||||||
ioctrl_(handler->get_bev())
|
ioctrl_(handler->get_bev())
|
||||||
{
|
{
|
||||||
http_parser_init(&htp_, HTTP_REQUEST);
|
http_parser_init(&htp_, HTTP_REQUEST);
|
||||||
|
@ -71,13 +71,12 @@ void HttpsUpstream::reset_current_header_length()
|
||||||
namespace {
|
namespace {
|
||||||
int htp_msg_begin(http_parser *htp)
|
int htp_msg_begin(http_parser *htp)
|
||||||
{
|
{
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
ULOG(INFO, upstream) << "HTTP request started";
|
ULOG(INFO, upstream) << "HTTP request started";
|
||||||
}
|
}
|
||||||
upstream->reset_current_header_length();
|
upstream->reset_current_header_length();
|
||||||
Downstream *downstream = new Downstream(upstream, 0, 0);
|
auto downstream = new Downstream(upstream, 0, 0);
|
||||||
upstream->attach_downstream(downstream);
|
upstream->attach_downstream(downstream);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -86,9 +85,8 @@ int htp_msg_begin(http_parser *htp)
|
||||||
namespace {
|
namespace {
|
||||||
int htp_uricb(http_parser *htp, const char *data, size_t len)
|
int htp_uricb(http_parser *htp, const char *data, size_t len)
|
||||||
{
|
{
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
auto downstream = upstream->get_downstream();
|
||||||
Downstream *downstream = upstream->get_downstream();
|
|
||||||
downstream->append_request_path(data, len);
|
downstream->append_request_path(data, len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -97,9 +95,8 @@ int htp_uricb(http_parser *htp, const char *data, size_t len)
|
||||||
namespace {
|
namespace {
|
||||||
int htp_hdr_keycb(http_parser *htp, const char *data, size_t len)
|
int htp_hdr_keycb(http_parser *htp, const char *data, size_t len)
|
||||||
{
|
{
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
auto downstream = upstream->get_downstream();
|
||||||
Downstream *downstream = upstream->get_downstream();
|
|
||||||
if(downstream->get_request_header_key_prev()) {
|
if(downstream->get_request_header_key_prev()) {
|
||||||
downstream->append_last_request_header_key(data, len);
|
downstream->append_last_request_header_key(data, len);
|
||||||
} else {
|
} else {
|
||||||
|
@ -112,9 +109,8 @@ int htp_hdr_keycb(http_parser *htp, const char *data, size_t len)
|
||||||
namespace {
|
namespace {
|
||||||
int htp_hdr_valcb(http_parser *htp, const char *data, size_t len)
|
int htp_hdr_valcb(http_parser *htp, const char *data, size_t len)
|
||||||
{
|
{
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
auto downstream = upstream->get_downstream();
|
||||||
Downstream *downstream = upstream->get_downstream();
|
|
||||||
if(downstream->get_request_header_key_prev()) {
|
if(downstream->get_request_header_key_prev()) {
|
||||||
downstream->set_last_request_header_value(std::string(data, len));
|
downstream->set_last_request_header_value(std::string(data, len));
|
||||||
} else {
|
} else {
|
||||||
|
@ -128,12 +124,11 @@ namespace {
|
||||||
int htp_hdrs_completecb(http_parser *htp)
|
int htp_hdrs_completecb(http_parser *htp)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
ULOG(INFO, upstream) << "HTTP request headers completed";
|
ULOG(INFO, upstream) << "HTTP request headers completed";
|
||||||
}
|
}
|
||||||
Downstream *downstream = upstream->get_downstream();
|
auto downstream = upstream->get_downstream();
|
||||||
|
|
||||||
downstream->set_request_method(http_method_str((enum http_method)htp->method));
|
downstream->set_request_method(http_method_str((enum http_method)htp->method));
|
||||||
downstream->set_request_major(htp->http_major);
|
downstream->set_request_major(htp->http_major);
|
||||||
|
@ -148,7 +143,7 @@ int htp_hdrs_completecb(http_parser *htp)
|
||||||
<< downstream->get_request_path() << " "
|
<< downstream->get_request_path() << " "
|
||||||
<< "HTTP/" << downstream->get_request_major() << "."
|
<< "HTTP/" << downstream->get_request_major() << "."
|
||||||
<< downstream->get_request_minor() << "\n";
|
<< downstream->get_request_minor() << "\n";
|
||||||
const Headers& headers = downstream->get_request_headers();
|
const auto& headers = downstream->get_request_headers();
|
||||||
for(size_t i = 0; i < headers.size(); ++i) {
|
for(size_t i = 0; i < headers.size(); ++i) {
|
||||||
ss << TTY_HTTP_HD << headers[i].first << TTY_RST << ": "
|
ss << TTY_HTTP_HD << headers[i].first << TTY_RST << ": "
|
||||||
<< headers[i].second << "\n";
|
<< headers[i].second << "\n";
|
||||||
|
@ -160,7 +155,7 @@ int htp_hdrs_completecb(http_parser *htp)
|
||||||
downstream->get_request_method() != "CONNECT") {
|
downstream->get_request_method() != "CONNECT") {
|
||||||
// Make sure that request path is an absolute URI.
|
// Make sure that request path is an absolute URI.
|
||||||
http_parser_url u;
|
http_parser_url u;
|
||||||
const char *url = downstream->get_request_path().c_str();
|
auto url = downstream->get_request_path().c_str();
|
||||||
memset(&u, 0, sizeof(u));
|
memset(&u, 0, sizeof(u));
|
||||||
rv = http_parser_parse_url(url,
|
rv = http_parser_parse_url(url,
|
||||||
downstream->get_request_path().size(),
|
downstream->get_request_path().size(),
|
||||||
|
@ -171,8 +166,7 @@ int htp_hdrs_completecb(http_parser *htp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DownstreamConnection *dconn;
|
auto dconn = upstream->get_client_handler()->get_downstream_connection();
|
||||||
dconn = upstream->get_client_handler()->get_downstream_connection();
|
|
||||||
|
|
||||||
if(downstream->get_expect_100_continue()) {
|
if(downstream->get_expect_100_continue()) {
|
||||||
static const char reply_100[] = "HTTP/1.1 100 Continue\r\n\r\n";
|
static const char reply_100[] = "HTTP/1.1 100 Continue\r\n\r\n";
|
||||||
|
@ -205,9 +199,8 @@ namespace {
|
||||||
int htp_bodycb(http_parser *htp, const char *data, size_t len)
|
int htp_bodycb(http_parser *htp, const char *data, size_t len)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
auto downstream = upstream->get_downstream();
|
||||||
Downstream *downstream = upstream->get_downstream();
|
|
||||||
rv = downstream->push_upload_data_chunk
|
rv = downstream->push_upload_data_chunk
|
||||||
(reinterpret_cast<const uint8_t*>(data), len);
|
(reinterpret_cast<const uint8_t*>(data), len);
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
|
@ -221,12 +214,11 @@ namespace {
|
||||||
int htp_msg_completecb(http_parser *htp)
|
int htp_msg_completecb(http_parser *htp)
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
HttpsUpstream *upstream;
|
auto upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
||||||
upstream = reinterpret_cast<HttpsUpstream*>(htp->data);
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
ULOG(INFO, upstream) << "HTTP request completed";
|
ULOG(INFO, upstream) << "HTTP request completed";
|
||||||
}
|
}
|
||||||
Downstream *downstream = upstream->get_downstream();
|
auto downstream = upstream->get_downstream();
|
||||||
downstream->set_request_state(Downstream::MSG_COMPLETE);
|
downstream->set_request_state(Downstream::MSG_COMPLETE);
|
||||||
rv = downstream->end_upload_data();
|
rv = downstream->end_upload_data();
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
|
@ -256,10 +248,10 @@ http_parser_settings htp_hooks = {
|
||||||
// one http request is fully received.
|
// one http request is fully received.
|
||||||
int HttpsUpstream::on_read()
|
int HttpsUpstream::on_read()
|
||||||
{
|
{
|
||||||
bufferevent *bev = handler_->get_bev();
|
auto bev = handler_->get_bev();
|
||||||
evbuffer *input = bufferevent_get_input(bev);
|
auto input = bufferevent_get_input(bev);
|
||||||
size_t inputlen = evbuffer_get_length(input);
|
size_t inputlen = evbuffer_get_length(input);
|
||||||
unsigned char *mem = evbuffer_pullup(input, -1);
|
auto mem = evbuffer_pullup(input, -1);
|
||||||
|
|
||||||
if(inputlen == 0) {
|
if(inputlen == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -293,7 +285,7 @@ int HttpsUpstream::on_read()
|
||||||
// execution
|
// execution
|
||||||
downstream = get_downstream();
|
downstream = get_downstream();
|
||||||
auto handler = get_client_handler();
|
auto handler = get_client_handler();
|
||||||
http_errno htperr = HTTP_PARSER_ERRNO(&htp_);
|
auto htperr = HTTP_PARSER_ERRNO(&htp_);
|
||||||
if(htperr == HPE_PAUSED) {
|
if(htperr == HPE_PAUSED) {
|
||||||
if(downstream->get_request_state() == Downstream::CONNECT_FAIL) {
|
if(downstream->get_request_state() == Downstream::CONNECT_FAIL) {
|
||||||
handler->set_should_close_after_write(true);
|
handler->set_should_close_after_write(true);
|
||||||
|
@ -358,7 +350,7 @@ int HttpsUpstream::on_read()
|
||||||
int HttpsUpstream::on_write()
|
int HttpsUpstream::on_write()
|
||||||
{
|
{
|
||||||
int rv = 0;
|
int rv = 0;
|
||||||
Downstream *downstream = get_downstream();
|
auto downstream = get_downstream();
|
||||||
if(downstream) {
|
if(downstream) {
|
||||||
rv = downstream->resume_read(SHRPX_NO_BUFFER);
|
rv = downstream->resume_read(SHRPX_NO_BUFFER);
|
||||||
}
|
}
|
||||||
|
@ -395,10 +387,9 @@ int HttpsUpstream::resume_read(IOCtrlReason reason, Downstream *downstream)
|
||||||
namespace {
|
namespace {
|
||||||
void https_downstream_readcb(bufferevent *bev, void *ptr)
|
void https_downstream_readcb(bufferevent *bev, void *ptr)
|
||||||
{
|
{
|
||||||
DownstreamConnection *dconn = reinterpret_cast<DownstreamConnection*>(ptr);
|
auto dconn = reinterpret_cast<DownstreamConnection*>(ptr);
|
||||||
Downstream *downstream = dconn->get_downstream();
|
auto downstream = dconn->get_downstream();
|
||||||
HttpsUpstream *upstream;
|
auto upstream = static_cast<HttpsUpstream*>(downstream->get_upstream());
|
||||||
upstream = static_cast<HttpsUpstream*>(downstream->get_upstream());
|
|
||||||
int rv;
|
int rv;
|
||||||
rv = downstream->on_read();
|
rv = downstream->on_read();
|
||||||
if(downstream->get_response_state() == Downstream::MSG_RESET) {
|
if(downstream->get_response_state() == Downstream::MSG_RESET) {
|
||||||
|
@ -414,7 +405,7 @@ void https_downstream_readcb(bufferevent *bev, void *ptr)
|
||||||
// Keep-alive
|
// Keep-alive
|
||||||
dconn->detach_downstream(downstream);
|
dconn->detach_downstream(downstream);
|
||||||
}
|
}
|
||||||
ClientHandler *handler = upstream->get_client_handler();
|
auto handler = upstream->get_client_handler();
|
||||||
if(downstream->get_request_state() == Downstream::MSG_COMPLETE) {
|
if(downstream->get_request_state() == Downstream::MSG_COMPLETE) {
|
||||||
if(handler->get_should_close_after_write() &&
|
if(handler->get_should_close_after_write() &&
|
||||||
handler->get_pending_write_length() == 0) {
|
handler->get_pending_write_length() == 0) {
|
||||||
|
@ -449,8 +440,8 @@ void https_downstream_readcb(bufferevent *bev, void *ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ClientHandler *handler = upstream->get_client_handler();
|
auto handler = upstream->get_client_handler();
|
||||||
bufferevent *bev = handler->get_bev();
|
auto bev = handler->get_bev();
|
||||||
size_t outputlen = evbuffer_get_length(bufferevent_get_output(bev));
|
size_t outputlen = evbuffer_get_length(bufferevent_get_output(bev));
|
||||||
if(outputlen > SHRPX_HTTPS_UPSTREAM_OUTPUT_UPPER_THRES) {
|
if(outputlen > SHRPX_HTTPS_UPSTREAM_OUTPUT_UPPER_THRES) {
|
||||||
downstream->pause_read(SHRPX_NO_BUFFER);
|
downstream->pause_read(SHRPX_NO_BUFFER);
|
||||||
|
@ -486,10 +477,9 @@ void https_downstream_writecb(bufferevent *bev, void *ptr)
|
||||||
if(evbuffer_get_length(bufferevent_get_output(bev)) > 0) {
|
if(evbuffer_get_length(bufferevent_get_output(bev)) > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DownstreamConnection *dconn = reinterpret_cast<DownstreamConnection*>(ptr);
|
auto dconn = reinterpret_cast<DownstreamConnection*>(ptr);
|
||||||
Downstream *downstream = dconn->get_downstream();
|
auto downstream = dconn->get_downstream();
|
||||||
HttpsUpstream *upstream;
|
auto upstream = static_cast<HttpsUpstream*>(downstream->get_upstream());
|
||||||
upstream = static_cast<HttpsUpstream*>(downstream->get_upstream());
|
|
||||||
// May return -1
|
// May return -1
|
||||||
upstream->resume_read(SHRPX_NO_BUFFER, downstream);
|
upstream->resume_read(SHRPX_NO_BUFFER, downstream);
|
||||||
}
|
}
|
||||||
|
@ -498,10 +488,9 @@ void https_downstream_writecb(bufferevent *bev, void *ptr)
|
||||||
namespace {
|
namespace {
|
||||||
void https_downstream_eventcb(bufferevent *bev, short events, void *ptr)
|
void https_downstream_eventcb(bufferevent *bev, short events, void *ptr)
|
||||||
{
|
{
|
||||||
DownstreamConnection *dconn = reinterpret_cast<DownstreamConnection*>(ptr);
|
auto dconn = reinterpret_cast<DownstreamConnection*>(ptr);
|
||||||
Downstream *downstream = dconn->get_downstream();
|
auto downstream = dconn->get_downstream();
|
||||||
HttpsUpstream *upstream;
|
auto upstream = static_cast<HttpsUpstream*>(downstream->get_upstream());
|
||||||
upstream = static_cast<HttpsUpstream*>(downstream->get_upstream());
|
|
||||||
if(events & BEV_EVENT_CONNECTED) {
|
if(events & BEV_EVENT_CONNECTED) {
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
DCLOG(INFO, dconn) << "Connection established";
|
DCLOG(INFO, dconn) << "Connection established";
|
||||||
|
@ -519,7 +508,7 @@ void https_downstream_eventcb(bufferevent *bev, short events, void *ptr)
|
||||||
upstream->on_downstream_body_complete(downstream);
|
upstream->on_downstream_body_complete(downstream);
|
||||||
downstream->set_response_state(Downstream::MSG_COMPLETE);
|
downstream->set_response_state(Downstream::MSG_COMPLETE);
|
||||||
|
|
||||||
ClientHandler *handler = upstream->get_client_handler();
|
auto handler = upstream->get_client_handler();
|
||||||
if(handler->get_should_close_after_write() &&
|
if(handler->get_should_close_after_write() &&
|
||||||
handler->get_pending_write_length() == 0) {
|
handler->get_pending_write_length() == 0) {
|
||||||
// If all upstream response body has already written out to
|
// If all upstream response body has already written out to
|
||||||
|
@ -578,7 +567,7 @@ void https_downstream_eventcb(bufferevent *bev, short events, void *ptr)
|
||||||
|
|
||||||
int HttpsUpstream::error_reply(int status_code)
|
int HttpsUpstream::error_reply(int status_code)
|
||||||
{
|
{
|
||||||
std::string html = http::create_error_html(status_code);
|
auto html = http::create_error_html(status_code);
|
||||||
std::string header;
|
std::string header;
|
||||||
header.reserve(512);
|
header.reserve(512);
|
||||||
header += "HTTP/1.1 ";
|
header += "HTTP/1.1 ";
|
||||||
|
@ -592,13 +581,13 @@ int HttpsUpstream::error_reply(int status_code)
|
||||||
header += "Connection: close\r\n";
|
header += "Connection: close\r\n";
|
||||||
}
|
}
|
||||||
header += "\r\n";
|
header += "\r\n";
|
||||||
evbuffer *output = bufferevent_get_output(handler_->get_bev());
|
auto output = bufferevent_get_output(handler_->get_bev());
|
||||||
if(evbuffer_add(output, header.c_str(), header.size()) != 0 ||
|
if(evbuffer_add(output, header.c_str(), header.size()) != 0 ||
|
||||||
evbuffer_add(output, html.c_str(), html.size()) != 0) {
|
evbuffer_add(output, html.c_str(), html.size()) != 0) {
|
||||||
ULOG(FATAL, this) << "evbuffer_add() failed";
|
ULOG(FATAL, this) << "evbuffer_add() failed";
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
Downstream *downstream = get_downstream();
|
auto downstream = get_downstream();
|
||||||
if(downstream) {
|
if(downstream) {
|
||||||
downstream->set_response_state(Downstream::MSG_COMPLETE);
|
downstream->set_response_state(Downstream::MSG_COMPLETE);
|
||||||
}
|
}
|
||||||
|
@ -708,7 +697,7 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
}
|
}
|
||||||
ULOG(INFO, this) << "HTTP response headers\n" << hdrp;
|
ULOG(INFO, this) << "HTTP response headers\n" << hdrp;
|
||||||
}
|
}
|
||||||
evbuffer *output = bufferevent_get_output(handler_->get_bev());
|
auto output = bufferevent_get_output(handler_->get_bev());
|
||||||
if(evbuffer_add(output, hdrs.c_str(), hdrs.size()) != 0) {
|
if(evbuffer_add(output, hdrs.c_str(), hdrs.size()) != 0) {
|
||||||
ULOG(FATAL, this) << "evbuffer_add() failed";
|
ULOG(FATAL, this) << "evbuffer_add() failed";
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -727,7 +716,7 @@ int HttpsUpstream::on_downstream_body(Downstream *downstream,
|
||||||
if(len == 0) {
|
if(len == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
evbuffer *output = bufferevent_get_output(handler_->get_bev());
|
auto output = bufferevent_get_output(handler_->get_bev());
|
||||||
if(downstream->get_chunked_response()) {
|
if(downstream->get_chunked_response()) {
|
||||||
char chunk_size_hex[16];
|
char chunk_size_hex[16];
|
||||||
rv = snprintf(chunk_size_hex, sizeof(chunk_size_hex), "%X\r\n",
|
rv = snprintf(chunk_size_hex, sizeof(chunk_size_hex), "%X\r\n",
|
||||||
|
@ -753,7 +742,7 @@ int HttpsUpstream::on_downstream_body(Downstream *downstream,
|
||||||
int HttpsUpstream::on_downstream_body_complete(Downstream *downstream)
|
int HttpsUpstream::on_downstream_body_complete(Downstream *downstream)
|
||||||
{
|
{
|
||||||
if(downstream->get_chunked_response()) {
|
if(downstream->get_chunked_response()) {
|
||||||
evbuffer *output = bufferevent_get_output(handler_->get_bev());
|
auto output = bufferevent_get_output(handler_->get_bev());
|
||||||
if(evbuffer_add(output, "0\r\n\r\n", 5) != 0) {
|
if(evbuffer_add(output, "0\r\n\r\n", 5) != 0) {
|
||||||
ULOG(FATAL, this) << "evbuffer_add() failed";
|
ULOG(FATAL, this) << "evbuffer_add() failed";
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -764,7 +753,7 @@ int HttpsUpstream::on_downstream_body_complete(Downstream *downstream)
|
||||||
}
|
}
|
||||||
if(downstream->get_request_connection_close() ||
|
if(downstream->get_request_connection_close() ||
|
||||||
downstream->get_response_connection_close()) {
|
downstream->get_response_connection_close()) {
|
||||||
ClientHandler *handler = get_client_handler();
|
auto handler = get_client_handler();
|
||||||
handler->set_should_close_after_write(true);
|
handler->set_should_close_after_write(true);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue