diff options
Diffstat (limited to 'pkgs/tools/networking/curl/fix-http2-window-size.patch')
-rw-r--r-- | pkgs/tools/networking/curl/fix-http2-window-size.patch | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/pkgs/tools/networking/curl/fix-http2-window-size.patch b/pkgs/tools/networking/curl/fix-http2-window-size.patch new file mode 100644 index 000000000000..6fac3e1b42ac --- /dev/null +++ b/pkgs/tools/networking/curl/fix-http2-window-size.patch @@ -0,0 +1,88 @@ +From a4d888857ede39a8e2aa5f961048c6362d3a5377 Mon Sep 17 00:00:00 2001 +From: Jay Satiro <raysatiro@yahoo.com> +Date: Wed, 16 Nov 2016 02:55:30 -0500 +Subject: [PATCH] http2: Use huge HTTP/2 windows + +- Improve performance by using a huge HTTP/2 window size. + +Bug: https://github.com/curl/curl/issues/1102 +Reported-by: afrind@users.noreply.github.com +Assisted-by: Tatsuhiro Tsujikawa +--- + docs/TODO | 8 -------- + lib/http2.c | 15 +++++++++++++-- + 2 files changed, 13 insertions(+), 10 deletions(-) + +diff --git a/docs/TODO b/docs/TODO +index c3bc4eb..99c610f 100644 +--- a/docs/TODO ++++ b/docs/TODO +@@ -63,7 +63,6 @@ + 5.1 Better persistency for HTTP 1.0 + 5.2 support FF3 sqlite cookie files + 5.3 Rearrange request header order +- 5.4 Use huge HTTP/2 windows + 5.5 auth= in URLs + 5.6 Refuse "downgrade" redirects + 5.7 Brotli compression +@@ -528,13 +527,6 @@ This is not detailed in any FTP specification. + headers use a default value so only headers that need to be moved have to be + specified. + +-5.4 Use huge HTTP/2 windows +- +- We're currently using nghttp2's default window size which is terribly small +- (64K). This becomes a bottle neck over high bandwidth networks. We should +- instead make the window size to be very big (512MB?) as we really don't do +- much flow control anyway. +- + 5.5 auth= in URLs + + Add the ability to specify the preferred authentication mechanism to use by +diff --git a/lib/http2.c b/lib/http2.c +index 6720984..202ab1b 100644 +--- a/lib/http2.c ++++ b/lib/http2.c +@@ -59,6 +59,8 @@ + #define nghttp2_session_callbacks_set_error_callback(x,y) + #endif + ++#define HTTP2_HUGE_WINDOW_SIZE (1 << 30) ++ + /* + * Curl_http2_init_state() is called when the easy handle is created and + * allows for HTTP/2 specific init of state. +@@ -965,7 +967,7 @@ static ssize_t data_source_read_callback(nghttp2_session *session, + */ + static nghttp2_settings_entry settings[] = { + { NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100 }, +- { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, NGHTTP2_INITIAL_WINDOW_SIZE }, ++ { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, HTTP2_HUGE_WINDOW_SIZE }, + }; + + #define H2_BUFSIZE 32768 +@@ -2031,7 +2033,8 @@ CURLcode Curl_http2_switched(struct connectdata *conn, + else { + /* stream ID is unknown at this point */ + stream->stream_id = -1; +- rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, NULL, 0); ++ rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, settings, ++ sizeof(settings) / sizeof(settings[0])); + if(rv != 0) { + failf(data, "nghttp2_submit_settings() failed: %s(%d)", + nghttp2_strerror(rv), rv); +@@ -2039,6 +2042,14 @@ CURLcode Curl_http2_switched(struct connectdata *conn, + } + } + ++ rv = nghttp2_session_set_local_window_size(httpc->h2, NGHTTP2_FLAG_NONE, 0, ++ HTTP2_HUGE_WINDOW_SIZE); ++ if(rv != 0) { ++ failf(data, "nghttp2_session_set_local_window_size() failed: %s(%d)", ++ nghttp2_strerror(rv), rv); ++ return CURLE_HTTP2; ++ } ++ + /* we are going to copy mem to httpc->inbuf. This is required since + mem is part of buffer pointed by stream->mem, and callbacks + called by nghttp2_session_mem_recv() will write stream specific |