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 Diff line number Diff line
@@ -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
+13 −2
Original line number Diff line number Diff line
@@ -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