nghttp: Add -W option to specify connection level window size bits

This commit is contained in:
Tatsuhiro Tsujikawa 2013-10-10 22:04:37 +09:00
parent 154a0014ef
commit 2e7edf88bc
1 changed files with 32 additions and 9 deletions

View File

@ -90,6 +90,7 @@ struct Config {
std::string certfile; std::string certfile;
std::string keyfile; std::string keyfile;
int window_bits; int window_bits;
int connection_window_bits;
std::map<std::string, std::string> headers; std::map<std::string, std::string> headers;
std::string datafile; std::string datafile;
size_t output_upper_thres; size_t output_upper_thres;
@ -106,6 +107,7 @@ struct Config {
multiply(1), multiply(1),
timeout(-1), timeout(-1),
window_bits(-1), window_bits(-1),
connection_window_bits(-1),
output_upper_thres(1024*1024), output_upper_thres(1024*1024),
peer_max_concurrent_streams(NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS) peer_max_concurrent_streams(NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS)
{} {}
@ -688,6 +690,14 @@ struct HttpClient {
return -1; return -1;
} }
} }
if(config.connection_window_bits != -1) {
rv = nghttp2_submit_window_update
(session, NGHTTP2_FLAG_NONE, 0,
(1 << config.connection_window_bits) - 1);
if(rv != 0) {
return -1;
}
}
// Adjust first request depending on the existence of the upload // Adjust first request depending on the existence of the upload
// data // data
for(auto i = std::begin(reqvec)+(need_upgrade() && !reqvec[0]->data_prd); for(auto i = std::begin(reqvec)+(need_upgrade() && !reqvec[0]->data_prd);
@ -1494,8 +1504,9 @@ int run(char **uris, int n)
namespace { namespace {
void print_usage(std::ostream& out) void print_usage(std::ostream& out)
{ {
out << "Usage: nghttp [-Oafnsuv] [-t <SECONDS>] [-w <WINDOW_BITS>] [--cert=<CERT>]\n" out << "Usage: nghttp [-Oafnsuv] [-t <SECONDS>] [-w <WINDOW_BITS>] [-W <WINDOW_BITS>]\n"
<< " [--key=<KEY>] [-d <FILE>] [-m <N>] [-p <PRIORITY>] [-M <N>]\n" << " [--cert=<CERT>] [--key=<KEY>] [-d <FILE>] [-m <N>]\n"
<< " [-p <PRIORITY>] [-M <N>]\n"
<< " <URI>..." << " <URI>..."
<< std::endl; << std::endl;
} }
@ -1516,7 +1527,11 @@ void print_help(std::ostream& out)
<< " filename. Not implemented yet.\n" << " filename. Not implemented yet.\n"
<< " -t, --timeout=<N> Timeout each request after <N> seconds.\n" << " -t, --timeout=<N> Timeout each request after <N> seconds.\n"
<< " -w, --window-bits=<N>\n" << " -w, --window-bits=<N>\n"
<< " Sets the initial window size to 2**<N>-1.\n" << " Sets the stream level initial window size\n"
<< " to 2**<N>-1.\n"
<< " -W, --connection-window-bits=<N>\n"
<< " Sets the connection level initial window\n"
<< " size to 2**<N>-1.\n"
<< " -a, --get-assets Download assets such as stylesheets, images\n" << " -a, --get-assets Download assets such as stylesheets, images\n"
<< " and script files linked from the downloaded\n" << " and script files linked from the downloaded\n"
<< " resource. Only links whose origins are the\n" << " resource. Only links whose origins are the\n"
@ -1563,6 +1578,7 @@ int main(int argc, char **argv)
{"remote-name", no_argument, nullptr, 'O'}, {"remote-name", no_argument, nullptr, 'O'},
{"timeout", required_argument, nullptr, 't'}, {"timeout", required_argument, nullptr, 't'},
{"window-bits", required_argument, nullptr, 'w'}, {"window-bits", required_argument, nullptr, 'w'},
{"connection-window-bits", required_argument, nullptr, 'W'},
{"get-assets", no_argument, nullptr, 'a'}, {"get-assets", no_argument, nullptr, 'a'},
{"stat", no_argument, nullptr, 's'}, {"stat", no_argument, nullptr, 's'},
{"cert", required_argument, &flag, 1}, {"cert", required_argument, &flag, 1},
@ -1578,7 +1594,7 @@ int main(int argc, char **argv)
{nullptr, 0, nullptr, 0 } {nullptr, 0, nullptr, 0 }
}; };
int option_index = 0; int option_index = 0;
int c = getopt_long(argc, argv, "M:Oad:fm:np:hH:vst:uw:", long_options, int c = getopt_long(argc, argv, "M:Oad:fm:np:hH:vst:uw:W:", long_options,
&option_index); &option_index);
if(c == -1) { if(c == -1) {
break; break;
@ -1621,13 +1637,20 @@ int main(int argc, char **argv)
case 'u': case 'u':
config.upgrade = true; config.upgrade = true;
break; break;
case 'w': { case 'w':
case 'W': {
errno = 0; errno = 0;
unsigned long int n = strtoul(optarg, nullptr, 10); char *endptr = nullptr;
if(errno == 0 && n < 31) { unsigned long int n = strtoul(optarg, &endptr, 10);
config.window_bits = n; if(errno == 0 && *endptr == '\0' && n < 31) {
if(c == 'w') {
config.window_bits = n;
} else {
config.connection_window_bits = n;
}
} else { } else {
std::cerr << "-w: specify the integer in the range [0, 30], inclusive" std::cerr << "-" << static_cast<char>(c)
<< ": specify the integer in the range [0, 30], inclusive"
<< std::endl; << std::endl;
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }