diff options
author | Daniel Stenberg <daniel@haxx.se> | 2019-08-07 19:30:53 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2019-08-08 08:28:43 +0200 |
commit | a93b43cde82d7a48014990d6a31dc917c1b5f93c (patch) | |
tree | ccf50dc0167cd1104240e97ec28e2ff4ef08cae1 /lib | |
parent | 98c3f14871d1de77d1f9704e2f309aef9be33553 (diff) | |
download | curl-a93b43cde82d7a48014990d6a31dc917c1b5f93c.tar.gz |
http3: fix the HTTP/3 in the request, make alt-svc set right versions
Closes #4200
Diffstat (limited to 'lib')
-rw-r--r-- | lib/http.c | 79 | ||||
-rw-r--r-- | lib/url.c | 6 |
2 files changed, 46 insertions, 39 deletions
diff --git a/lib/http.c b/lib/http.c index 73d52aee5..12e260bff 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1666,6 +1666,12 @@ static bool use_http_1_1plus(const struct Curl_easy *data, static const char *get_http_string(const struct Curl_easy *data, const struct connectdata *conn) { +#ifdef ENABLE_QUIC + if((data->set.httpversion == CURL_HTTP_VERSION_3) || + (conn->httpversion == 30)) + return "3"; +#endif + #ifdef USE_NGHTTP2 if(conn->proto.httpc.h2) return "2"; @@ -2005,49 +2011,50 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) the rest of the request in the PERFORM phase. */ *done = TRUE; - if(conn->httpversion < 20) { /* unless the connection is re-used and already - http2 */ - switch(conn->negnpn) { - case CURL_HTTP_VERSION_2: - conn->httpversion = 20; /* we know we're on HTTP/2 now */ - - result = Curl_http2_switched(conn, NULL, 0); - if(result) - return result; - break; - case CURL_HTTP_VERSION_1_1: - /* continue with HTTP/1.1 when explicitly requested */ - break; - default: - /* 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) { - if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) { - /* We don't support HTTP/2 proxies yet. Also it's debatable whether - or not this setting should apply to HTTP/2 proxies. */ - infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n"); - break; - } - - DEBUGF(infof(data, "HTTP/2 over clean TCP\n")); - conn->httpversion = 20; + if(conn->transport != TRNSPRT_QUIC) { + if(conn->httpversion < 20) { /* unless the connection is re-used and + already http2 */ + switch(conn->negnpn) { + case CURL_HTTP_VERSION_2: + conn->httpversion = 20; /* we know we're on HTTP/2 now */ result = Curl_http2_switched(conn, NULL, 0); if(result) return result; - } + break; + case CURL_HTTP_VERSION_1_1: + /* continue with HTTP/1.1 when explicitly requested */ + break; + default: + /* 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) { + if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) { + /* We don't support HTTP/2 proxies yet. Also it's debatable + whether or not this setting should apply to HTTP/2 proxies. */ + infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n"); + break; + } + + 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; + break; + } + } + else { + /* prepare for a http2 request */ + result = Curl_http2_setup(conn); + if(result) + return result; } } - else { - /* prepare for a http2 request */ - result = Curl_http2_setup(conn); - if(result) - return result; - } - http = data->req.protop; DEBUGASSERT(http); @@ -3195,14 +3195,14 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data, /* protocol version switch */ switch(nalpnid) { case ALPN_h1: - conn->httpversion = CURL_HTTP_VERSION_1_1; + conn->httpversion = 11; break; case ALPN_h2: - conn->httpversion = CURL_HTTP_VERSION_2TLS; + conn->httpversion = 20; break; case ALPN_h3: conn->transport = TRNSPRT_QUIC; - conn->httpversion = CURL_HTTP_VERSION_3; + conn->httpversion = 30; break; default: /* shouldn't be possible */ break; |