nghttpx: Log non-final response headers
This commit is contained in:
parent
15055c11f9
commit
04b5d1679f
|
@ -921,11 +921,20 @@ int on_response_headers(Http2Session *http2session,
|
||||||
downstream->set_response_major(2);
|
downstream->set_response_major(2);
|
||||||
downstream->set_response_minor(0);
|
downstream->set_response_minor(0);
|
||||||
|
|
||||||
|
if(LOG_ENABLED(INFO)) {
|
||||||
|
std::stringstream ss;
|
||||||
|
for(auto& nv : nva) {
|
||||||
|
ss << TTY_HTTP_HD << nv.name << TTY_RST << ": " << nv.value << "\n";
|
||||||
|
}
|
||||||
|
SSLOG(INFO, http2session) << "HTTP response headers. stream_id="
|
||||||
|
<< frame->hd.stream_id
|
||||||
|
<< "\n" << ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
if(downstream->get_non_final_response()) {
|
if(downstream->get_non_final_response()) {
|
||||||
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
SSLOG(INFO, http2session) << "HTTP non-final response. stream_id="
|
SSLOG(INFO, http2session) << "This is non-final response.";
|
||||||
<< frame->hd.stream_id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
downstream->set_expect_final_response(true);
|
downstream->set_expect_final_response(true);
|
||||||
|
@ -944,16 +953,6 @@ int on_response_headers(Http2Session *http2session,
|
||||||
|
|
||||||
downstream->set_expect_final_response(false);
|
downstream->set_expect_final_response(false);
|
||||||
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
|
||||||
std::stringstream ss;
|
|
||||||
for(auto& nv : nva) {
|
|
||||||
ss << TTY_HTTP_HD << nv.name << TTY_RST << ": " << nv.value << "\n";
|
|
||||||
}
|
|
||||||
SSLOG(INFO, http2session) << "HTTP response headers. stream_id="
|
|
||||||
<< frame->hd.stream_id
|
|
||||||
<< "\n" << ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto content_length = http2::get_header(nva, "content-length");
|
auto content_length = http2::get_header(nva, "content-length");
|
||||||
if(!content_length && downstream->get_request_method() != "HEAD" &&
|
if(!content_length && downstream->get_request_method() != "HEAD" &&
|
||||||
downstream->get_request_method() != "CONNECT") {
|
downstream->get_request_method() != "CONNECT") {
|
||||||
|
|
|
@ -1163,6 +1163,10 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
http2::copy_norm_headers_to_nva(nva, downstream->get_response_headers());
|
http2::copy_norm_headers_to_nva(nva, downstream->get_response_headers());
|
||||||
|
|
||||||
if(downstream->get_non_final_response()) {
|
if(downstream->get_non_final_response()) {
|
||||||
|
if(LOG_ENABLED(INFO)) {
|
||||||
|
log_response_headers(downstream, nva);
|
||||||
|
}
|
||||||
|
|
||||||
rv = nghttp2_submit_headers(session_, NGHTTP2_FLAG_NONE,
|
rv = nghttp2_submit_headers(session_, NGHTTP2_FLAG_NONE,
|
||||||
downstream->get_stream_id(), nullptr,
|
downstream->get_stream_id(), nullptr,
|
||||||
nva.data(), nva.size(), nullptr);
|
nva.data(), nva.size(), nullptr);
|
||||||
|
@ -1197,17 +1201,7 @@ int Http2Upstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
std::stringstream ss;
|
log_response_headers(downstream, nva);
|
||||||
for(auto& nv : nva) {
|
|
||||||
ss << TTY_HTTP_HD;
|
|
||||||
ss.write(reinterpret_cast<const char*>(nv.name), nv.namelen);
|
|
||||||
ss << TTY_RST << ": ";
|
|
||||||
ss.write(reinterpret_cast<const char*>(nv.value), nv.valuelen);
|
|
||||||
ss << "\n";
|
|
||||||
}
|
|
||||||
ULOG(INFO, this) << "HTTP response headers. stream_id="
|
|
||||||
<< downstream->get_stream_id() << "\n"
|
|
||||||
<< ss.str();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(get_config()->http2_upstream_dump_response_header) {
|
if(get_config()->http2_upstream_dump_response_header) {
|
||||||
|
@ -1334,4 +1328,20 @@ int Http2Upstream::consume(int32_t stream_id, size_t len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Http2Upstream::log_response_headers
|
||||||
|
(Downstream *downstream, const std::vector<nghttp2_nv>& nva) const
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
for(auto& nv : nva) {
|
||||||
|
ss << TTY_HTTP_HD;
|
||||||
|
ss.write(reinterpret_cast<const char*>(nv.name), nv.namelen);
|
||||||
|
ss << TTY_RST << ": ";
|
||||||
|
ss.write(reinterpret_cast<const char*>(nv.value), nv.valuelen);
|
||||||
|
ss << "\n";
|
||||||
|
}
|
||||||
|
ULOG(INFO, this) << "HTTP response headers. stream_id="
|
||||||
|
<< downstream->get_stream_id() << "\n"
|
||||||
|
<< ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
|
@ -79,6 +79,8 @@ public:
|
||||||
int start_settings_timer();
|
int start_settings_timer();
|
||||||
void stop_settings_timer();
|
void stop_settings_timer();
|
||||||
int consume(int32_t stream_id, size_t len);
|
int consume(int32_t stream_id, size_t len);
|
||||||
|
void log_response_headers(Downstream *downstream,
|
||||||
|
const std::vector<nghttp2_nv>& nva) const;
|
||||||
private:
|
private:
|
||||||
DownstreamQueue downstream_queue_;
|
DownstreamQueue downstream_queue_;
|
||||||
std::unique_ptr<HttpsUpstream> pre_upstream_;
|
std::unique_ptr<HttpsUpstream> pre_upstream_;
|
||||||
|
|
|
@ -776,6 +776,10 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
if(downstream->get_non_final_response()) {
|
if(downstream->get_non_final_response()) {
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
|
|
||||||
|
if(LOG_ENABLED(INFO)) {
|
||||||
|
log_response_headers(hdrs);
|
||||||
|
}
|
||||||
|
|
||||||
auto 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";
|
||||||
|
@ -846,17 +850,11 @@ int HttpsUpstream::on_downstream_header_complete(Downstream *downstream)
|
||||||
}
|
}
|
||||||
|
|
||||||
hdrs += "\r\n";
|
hdrs += "\r\n";
|
||||||
|
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
const char *hdrp;
|
log_response_headers(hdrs);
|
||||||
std::string nhdrs;
|
|
||||||
if(worker_config.errorlog_tty) {
|
|
||||||
nhdrs = http::colorizeHeaders(hdrs.c_str());
|
|
||||||
hdrp = nhdrs.c_str();
|
|
||||||
} else {
|
|
||||||
hdrp = hdrs.c_str();
|
|
||||||
}
|
|
||||||
ULOG(INFO, this) << "HTTP response headers\n" << hdrp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto 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";
|
||||||
|
@ -939,4 +937,17 @@ int HttpsUpstream::on_downstream_abort_request(Downstream *downstream,
|
||||||
return error_reply(status_code);
|
return error_reply(status_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HttpsUpstream::log_response_headers(const std::string& hdrs) const
|
||||||
|
{
|
||||||
|
const char *hdrp;
|
||||||
|
std::string nhdrs;
|
||||||
|
if(worker_config.errorlog_tty) {
|
||||||
|
nhdrs = http::colorizeHeaders(hdrs.c_str());
|
||||||
|
hdrp = nhdrs.c_str();
|
||||||
|
} else {
|
||||||
|
hdrp = hdrs.c_str();
|
||||||
|
}
|
||||||
|
ULOG(INFO, this) << "HTTP response headers\n" << hdrp;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
|
@ -65,6 +65,7 @@ public:
|
||||||
virtual int on_downstream_body_complete(Downstream *downstream);
|
virtual int on_downstream_body_complete(Downstream *downstream);
|
||||||
|
|
||||||
void reset_current_header_length();
|
void reset_current_header_length();
|
||||||
|
void log_response_headers(const std::string& hdrs) const;
|
||||||
private:
|
private:
|
||||||
ClientHandler *handler_;
|
ClientHandler *handler_;
|
||||||
http_parser htp_;
|
http_parser htp_;
|
||||||
|
|
Loading…
Reference in New Issue