Commit 324a97ec authored by Diego Bes's avatar Diego Bes Committed by Daniel Stenberg
Browse files

http2: support "prior knowledge", no upgrade from HTTP/1.1

Supports HTTP/2 over clear TCP

- Optimize switching to HTTP/2 by removing calls to init and setup
before switching. Switching will eventually call setup and setup calls
init.

- Supports new version to “force” the use of HTTP/2 over clean TCP

- Add common line parameter “--http2-prior-knowledge” to the Curl
  command line tool.
parent e6831829
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -96,6 +96,9 @@ curl tool

curl offers the `--http2` command line option to enable use of HTTP/2.

curl offers the `--http2-prior-knowledge` command line option to enable use of 
HTTP/2 without HTTP/1.1 Upgrade.

Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections.

HTTP Alternative Services
+5 −0
Original line number Diff line number Diff line
@@ -150,6 +150,11 @@ version. (Added in 7.33.0)
.IP "--http2"
(HTTP) Tells curl to issue its requests using HTTP 2. This requires that the
underlying libcurl was built to support it. (Added in 7.33.0)
.IP "--http2-prior-knowledge"
(HTTP) Tells curl to issue its requests using HTTP 2 without HTTP/1.1 Upgrade. 
This requires prior knowledge that the server supports HTTP 2.
This requires that the underlying libcurl was built to support it. 
(Added in 7.49.0)
.IP "--no-npn"
Disable the NPN TLS extension. NPN is enabled by default if libcurl was built
with an SSL library that supports NPN. NPN is used by a libcurl that supports
+1 −0
Original line number Diff line number Diff line
@@ -695,6 +695,7 @@ CURL_HTTP_VERSION_1_1 7.9.1
CURL_HTTP_VERSION_2             7.43.0
CURL_HTTP_VERSION_2_0           7.33.0
CURL_HTTP_VERSION_2TLS          7.47.0
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0
CURL_HTTP_VERSION_NONE          7.9.1
CURL_IPRESOLVE_V4               7.10.8
CURL_IPRESOLVE_V6               7.10.8
+2 −0
Original line number Diff line number Diff line
@@ -1727,6 +1727,8 @@ enum {
  CURL_HTTP_VERSION_1_1,  /* please use HTTP 1.1 in the request */
  CURL_HTTP_VERSION_2_0,  /* please use HTTP 2 in the request */
  CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
  CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE,  /* please use HTTP 2 without HTTP/1.1
                                           Upgrade */

  CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
};
+12 −8
Original line number Diff line number Diff line
@@ -1792,13 +1792,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
    switch(conn->negnpn) {
    case CURL_HTTP_VERSION_2:
      conn->httpversion = 20; /* we know we're on HTTP/2 now */
      result = Curl_http2_init(conn);
      if(result)
        return result;

      result = Curl_http2_setup(conn);
      if(result)
        return result;

      result = Curl_http2_switched(conn, NULL, 0);
      if(result)
@@ -1808,7 +1801,18 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
      /* continue with HTTP/1.1 when explicitly requested */
      break;
    default:
      /* and as fallback */
      /* Check if user wants to use HTTP/2 with clear TCP*/
#ifdef USE_NGHTTP2
      if(conn->data->set.httpversion ==
         CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
        DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
        conn->httpversion = 20;

        result = Curl_http2_switched(conn, NULL, 0);
        if(result)
          return result;
      }
#endif
      break;
    }
  }
Loading