nghttpd: Add -w and -W options to change window size

This commit is contained in:
Tatsuhiro Tsujikawa 2016-01-27 22:34:17 +09:00
parent 85bb37ab7c
commit 5b195092e1
3 changed files with 49 additions and 1 deletions

View File

@ -109,6 +109,8 @@ Config::Config()
num_worker(1),
max_concurrent_streams(100),
header_table_size(-1),
window_bits(-1),
connection_window_bits(-1),
port(0),
verbose(false),
daemon(false),
@ -845,11 +847,28 @@ int Http2Handler::connection_made() {
entry[niv].value = config->header_table_size;
++niv;
}
if (config->window_bits != -1) {
entry[niv].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
entry[niv].value = (1 << config->window_bits) - 1;
++niv;
}
r = nghttp2_submit_settings(session_, NGHTTP2_FLAG_NONE, entry.data(), niv);
if (r != 0) {
return r;
}
if (config->connection_window_bits != -1) {
r = nghttp2_submit_window_update(
session_, NGHTTP2_FLAG_NONE, 0,
(1 << config->connection_window_bits) - 1 -
NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE);
if (r != 0) {
return r;
}
}
ev_timer_start(sessions_->get_loop(), &settings_timerev_);
if (ssl_ && !nghttp2::ssl::check_http2_requirement(ssl_)) {

View File

@ -67,6 +67,8 @@ struct Config {
size_t num_worker;
size_t max_concurrent_streams;
ssize_t header_table_size;
int window_bits;
int connection_window_bits;
uint16_t port;
bool verbose;
bool daemon;

View File

@ -143,6 +143,11 @@ Options:
Default: 1
-e, --error-gzip
Make error response gzipped.
-w, --window-bits=<N>
Sets the stream level initial window size to 2**<N>-1.
-W, --connection-window-bits=<N>
Sets the connection level initial window size to
2**<N>-1.
--dh-param-file=<PATH>
Path to file that contains DH parameters in PEM format.
Without this option, DHE cipher suites are not
@ -202,6 +207,8 @@ int main(int argc, char **argv) {
{"max-concurrent-streams", required_argument, nullptr, 'm'},
{"workers", required_argument, nullptr, 'n'},
{"error-gzip", no_argument, nullptr, 'e'},
{"window-bits", required_argument, nullptr, 'w'},
{"connection-window-bits", required_argument, nullptr, 'W'},
{"no-tls", no_argument, &flag, 1},
{"color", no_argument, &flag, 2},
{"version", no_argument, &flag, 3},
@ -214,7 +221,7 @@ int main(int argc, char **argv) {
{"no-content-length", no_argument, &flag, 10},
{nullptr, 0, nullptr, 0}};
int option_index = 0;
int c = getopt_long(argc, argv, "DVb:c:d:ehm:n:p:va:", long_options,
int c = getopt_long(argc, argv, "DVb:c:d:ehm:n:p:va:w:W:", long_options,
&option_index);
char *end;
if (c == -1) {
@ -281,6 +288,26 @@ int main(int argc, char **argv) {
std::cerr << "-p: Bad option value: " << optarg << std::endl;
}
break;
case 'w':
case 'W': {
char *endptr;
errno = 0;
auto n = strtoul(optarg, &endptr, 10);
if (errno != 0 || *endptr != '\0' || n >= 31) {
std::cerr << "-" << static_cast<char>(c)
<< ": specify the integer in the range [0, 30], inclusive"
<< std::endl;
exit(EXIT_FAILURE);
}
if (c == 'w') {
config.window_bits = n;
} else {
config.connection_window_bits = n;
}
break;
}
case '?':
util::show_candidates(argv[optind - 1], long_options);
exit(EXIT_FAILURE);