Commit c280cc7c authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

nghttpx: Add --padding option for debugging purpose

parent 788072af
......@@ -437,6 +437,7 @@ void fill_default_config()
mod_config()->http2_upstream_dump_response_header = nullptr;
mod_config()->http2_no_cookie_crumbling = false;
mod_config()->upstream_frame_debug = false;
mod_config()->padding = 0;
}
} // namespace
......@@ -675,6 +676,11 @@ void print_help(std::ostream& out)
<< " --backend-no-tls Disable SSL/TLS on backend connections.\n"
<< " --http2-no-cookie-crumbling\n"
<< " Don't crumble cookie header field.\n"
<< " --padding=<BOUNDARY>\n"
<< " Padding boundary for HTTP/2 frame payload.\n"
<< " Specify 0 to disable padding. This option is\n"
<< " meant for debugging purpose and not intended\n"
<< " to enhance protocol security.\n"
<< "\n"
<< " Mode:\n"
<< " (default mode) Accept HTTP/2.0, SPDY and HTTP/1.1 over\n"
......@@ -824,6 +830,7 @@ int main(int argc, char **argv)
{"frontend-http2-connection-window-bits", required_argument, &flag, 46},
{"backend-http2-connection-window-bits", required_argument, &flag, 47},
{"tls-proto-list", required_argument, &flag, 48},
{"padding", required_argument, &flag, 49},
{nullptr, 0, nullptr, 0 }
};
......@@ -1060,6 +1067,10 @@ int main(int argc, char **argv)
// --tls-proto-list
cmdcfgs.emplace_back(SHRPX_OPT_TLS_PROTO_LIST, optarg);
break;
case 49:
// --padding
cmdcfgs.emplace_back(SHRPX_OPT_PADDING, optarg);
break;
default:
break;
}
......
......@@ -116,6 +116,7 @@ const char SHRPX_OPT_FRONTEND_HTTP2_DUMP_RESPONSE_HEADER[] =
"frontend-http2-dump-response-header";
const char SHRPX_OPT_HTTP2_NO_COOKIE_CRUMBLING[] = "http2-no-cookie-crumbling";
const char SHRPX_OPT_FRONTEND_FRAME_DEBUG[] = "frontend-frame-debug";
const char SHRPX_OPT_PADDING[] = "padding";
namespace {
Config *config = nullptr;
......@@ -483,6 +484,8 @@ int parse_config(const char *opt, const char *optarg)
mod_config()->http2_no_cookie_crumbling = util::strieq(optarg, "yes");
} else if(util::strieq(opt, SHRPX_OPT_FRONTEND_FRAME_DEBUG)) {
mod_config()->upstream_frame_debug = util::strieq(optarg, "yes");
} else if(util::strieq(opt, SHRPX_OPT_PADDING)) {
mod_config()->padding = strtoul(optarg, nullptr, 10);
} else if(util::strieq(opt, "conf")) {
LOG(WARNING) << "conf is ignored";
} else {
......
......@@ -103,6 +103,7 @@ extern const char SHRPX_OPT_FRONTEND_HTTP2_DUMP_REQUEST_HEADER[];
extern const char SHRPX_OPT_FRONTEND_HTTP2_DUMP_RESPONSE_HEADER[];
extern const char SHRPX_OPT_HTTP2_NO_COOKIE_CRUMBLING[];
extern const char SHRPX_OPT_FRONTEND_FRAME_DEBUG[];
extern const char SHRPX_OPT_PADDING[];
union sockaddr_union {
sockaddr sa;
......@@ -180,6 +181,7 @@ struct Config {
size_t npn_list_len;
// The number of elements in tls_proto_list
size_t tls_proto_list_len;
size_t padding;
// downstream protocol; this will be determined by given options.
shrpx_proto downstream_proto;
int syslog_facility;
......
......@@ -94,6 +94,17 @@ std::string colorizeHeaders(const char *hdrs)
return nhdrs;
}
ssize_t select_padding_callback
(nghttp2_session *session, const nghttp2_frame *frame, size_t max_payload,
void *user_data)
{
auto bd = get_config()->padding;
if(frame->hd.length == 0) {
return bd;
}
return std::min(max_payload, (frame->hd.length + bd - 1) / bd * bd);
}
} // namespace http
} // namespace shrpx
......@@ -29,6 +29,8 @@
#include <string>
#include <nghttp2/nghttp2.h>
namespace shrpx {
namespace http {
......@@ -40,6 +42,10 @@ std::string create_via_header_value(int major, int minor);
// Adds ANSI color codes to HTTP headers |hdrs|.
std::string colorizeHeaders(const char *hdrs);
ssize_t select_padding_callback
(nghttp2_session *session, const nghttp2_frame *frame, size_t max_payload,
void *user_data);
} // namespace http
} // namespace shrpx
......
......@@ -1193,6 +1193,9 @@ int Http2Session::on_connect()
callbacks.on_unknown_frame_recv_callback = on_unknown_frame_recv_callback;
callbacks.on_header_callback = on_header_callback;
callbacks.on_begin_headers_callback = on_begin_headers_callback;
if(get_config()->padding) {
callbacks.select_padding_callback = http::select_padding_callback;
}
nghttp2_opt_set opt_set;
opt_set.no_auto_stream_window_update = 1;
......
......@@ -519,6 +519,9 @@ Http2Upstream::Http2Upstream(ClientHandler *handler)
callbacks.on_unknown_frame_recv_callback = on_unknown_frame_recv_callback;
callbacks.on_header_callback = on_header_callback;
callbacks.on_begin_headers_callback = on_begin_headers_callback;
if(get_config()->padding) {
callbacks.select_padding_callback = http::select_padding_callback;
}
nghttp2_opt_set opt_set;
opt_set.no_auto_stream_window_update = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment