Commit a4d88885 authored by Jay Satiro's avatar Jay Satiro
Browse files

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: default avatar <afrind@users.noreply.github.com>
Assisted-by: Tatsuhiro Tsujikawa
parent 342aa479
Loading
Loading
Loading
Loading
+0 −8
Original line number Original line Diff line number Diff line
@@ -63,7 +63,6 @@
 5.1 Better persistency for HTTP 1.0
 5.1 Better persistency for HTTP 1.0
 5.2 support FF3 sqlite cookie files
 5.2 support FF3 sqlite cookie files
 5.3 Rearrange request header order
 5.3 Rearrange request header order
 5.4 Use huge HTTP/2 windows
 5.5 auth= in URLs
 5.5 auth= in URLs
 5.6 Refuse "downgrade" redirects
 5.6 Refuse "downgrade" redirects
 5.7 Brotli compression
 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
 headers use a default value so only headers that need to be moved have to be
 specified.
 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
5.5 auth= in URLs


 Add the ability to specify the preferred authentication mechanism to use by
 Add the ability to specify the preferred authentication mechanism to use by
+13 −2
Original line number Original line Diff line number Diff line
@@ -59,6 +59,8 @@
#define nghttp2_session_callbacks_set_error_callback(x,y)
#define nghttp2_session_callbacks_set_error_callback(x,y)
#endif
#endif


#define HTTP2_HUGE_WINDOW_SIZE (1 << 30)

/*
/*
 * Curl_http2_init_state() is called when the easy handle is created and
 * Curl_http2_init_state() is called when the easy handle is created and
 * allows for HTTP/2 specific init of state.
 * 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[] = {
static nghttp2_settings_entry settings[] = {
  { NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100 },
  { 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
#define H2_BUFSIZE 32768
@@ -2031,7 +2033,8 @@ CURLcode Curl_http2_switched(struct connectdata *conn,
  else {
  else {
    /* stream ID is unknown at this point */
    /* stream ID is unknown at this point */
    stream->stream_id = -1;
    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) {
    if(rv != 0) {
      failf(data, "nghttp2_submit_settings() failed: %s(%d)",
      failf(data, "nghttp2_submit_settings() failed: %s(%d)",
            nghttp2_strerror(rv), rv);
            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
  /* we are going to copy mem to httpc->inbuf.  This is required since
     mem is part of buffer pointed by stream->mem, and callbacks
     mem is part of buffer pointed by stream->mem, and callbacks
     called by nghttp2_session_mem_recv() will write stream specific
     called by nghttp2_session_mem_recv() will write stream specific