summaryrefslogtreecommitdiff
path: root/lib/url.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-08-02 14:28:54 +0200
committerDaniel Stenberg <daniel@haxx.se>2019-08-03 21:55:51 +0200
commitcc28a502bc3555fc9ebbcbbda6d0cbe561516541 (patch)
tree2b3bad50af1369ec0b302c6968d0bcb2c491706f /lib/url.c
parenta9a2b26830c9ecb38e6a02bc4e26684bf2cc5cc3 (diff)
downloadcurl-cc28a502bc3555fc9ebbcbbda6d0cbe561516541.tar.gz
url: make use of new HTTP version if alt-svc has one
Diffstat (limited to 'lib/url.c')
-rw-r--r--lib/url.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/lib/url.c b/lib/url.c
index 54373027b..13d015753 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -3160,11 +3160,23 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
const char *nhost;
int nport;
enum alpnid nalpnid;
+ enum alpnid salpnid;
bool hit;
host = conn->host.rawalloc;
+#ifdef USE_NGHTTP2
+ /* with h2 support, check that first */
+ salpnid = ALPN_h2;
hit = Curl_altsvc_lookup(data->asi,
- ALPN_h1, host, conn->remote_port, /* from */
+ salpnid, host, conn->remote_port, /* from */
&nalpnid, &nhost, &nport /* to */);
+ if(!hit)
+#endif
+ {
+ salpnid = ALPN_h1;
+ hit = Curl_altsvc_lookup(data->asi,
+ salpnid, host, conn->remote_port, /* from */
+ &nalpnid, &nhost, &nport /* to */);
+ }
if(hit) {
char *hostd = strdup((char *)nhost);
if(!hostd)
@@ -3175,8 +3187,25 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data,
conn->conn_to_port = nport;
conn->bits.conn_to_port = TRUE;
infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n",
- Curl_alpnid2str(ALPN_h1), host, conn->remote_port,
+ Curl_alpnid2str(salpnid), host, conn->remote_port,
Curl_alpnid2str(nalpnid), hostd, nport);
+ if(salpnid != nalpnid) {
+ /* protocol version switch */
+ switch(nalpnid) {
+ case ALPN_h1:
+ conn->httpversion = CURL_HTTP_VERSION_1_1;
+ break;
+ case ALPN_h2:
+ conn->httpversion = CURL_HTTP_VERSION_2TLS;
+ break;
+ case ALPN_h3:
+ conn->transport = TRNSPRT_QUIC;
+ conn->httpversion = CURL_HTTP_VERSION_LAST; /* for the moment */
+ break;
+ default: /* shouldn't be possible */
+ break;
+ }
+ }
}
}
#endif