From 98c3f14871d1de77d1f9704e2f309aef9be33553 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 7 Aug 2019 20:43:18 +0200 Subject: alt-svc: send Alt-Used: in redirected requests RFC 7838 section 5: When using an alternative service, clients SHOULD include an Alt-Used header field in all requests. Removed CURLALTSVC_ALTUSED again (feature is still EXPERIMENTAL thus this is deemed ok). You can disable sending this header just like you disable any other HTTP header in libcurl. Closes #4199 --- docs/libcurl/symbols-in-versions | 1 - include/curl/curl.h | 2 +- lib/http.c | 16 ++++++++++++++-- lib/url.c | 1 + lib/urldata.h | 1 + 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/libcurl/symbols-in-versions b/docs/libcurl/symbols-in-versions index 9a4cec2b0..7897d7c2f 100644 --- a/docs/libcurl/symbols-in-versions +++ b/docs/libcurl/symbols-in-versions @@ -12,7 +12,6 @@ Name Introduced Deprecated Removed -CURLALTSVC_ALTUSED 7.64.1 CURLALTSVC_H1 7.64.1 CURLALTSVC_H2 7.64.1 CURLALTSVC_H3 7.64.1 diff --git a/include/curl/curl.h b/include/curl/curl.h index 14703fd17..7b02846b4 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -883,7 +883,7 @@ typedef enum { /* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */ #define CURLALTSVC_IMMEDIATELY (1<<0) -#define CURLALTSVC_ALTUSED (1<<1) + #define CURLALTSVC_READONLYFILE (1<<2) #define CURLALTSVC_H1 (1<<3) #define CURLALTSVC_H2 (1<<4) diff --git a/lib/http.c b/lib/http.c index 546c34aad..73d52aee5 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1998,6 +1998,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) const char *httpstring; Curl_send_buffer *req_buffer; curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */ + char *altused = NULL; /* Always consider the DO phase done after this function call, even if there may be parts of the request that is not yet sent, since we can deal with @@ -2592,6 +2593,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) if(result) return result; +#ifdef USE_ALTSVC + if(conn->bits.altused && !Curl_checkheaders(conn, "Alt-Used")) { + altused = aprintf("Alt-Used: %s:%d\r\n", + conn->conn_to_host.name, conn->conn_to_port); + if(!altused) + return CURLE_OUT_OF_MEMORY; + } +#endif result = Curl_add_bufferf(&req_buffer, "%s" /* ftp typecode (;type=x) */ @@ -2606,7 +2615,8 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) "%s" /* accept-encoding */ "%s" /* referer */ "%s" /* Proxy-Connection */ - "%s",/* transfer-encoding */ + "%s" /* transfer-encoding */ + "%s",/* Alt-Used */ ftp_typecode, httpstring, @@ -2632,13 +2642,15 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) !conn->bits.tunnel_proxy && !Curl_checkProxyheaders(conn, "Proxy-Connection"))? "Proxy-Connection: Keep-Alive\r\n":"", - te + te, + altused ? altused : "" ); /* clear userpwd and proxyuserpwd to avoid re-using old credentials * from re-used connections */ Curl_safefree(conn->allocptr.userpwd); Curl_safefree(conn->allocptr.proxyuserpwd); + free(altused); if(result) return result; diff --git a/lib/url.c b/lib/url.c index 99bea3f01..d31f83065 100644 --- a/lib/url.c +++ b/lib/url.c @@ -3187,6 +3187,7 @@ static CURLcode parse_connect_to_slist(struct Curl_easy *data, conn->bits.conn_to_host = TRUE; conn->conn_to_port = nport; conn->bits.conn_to_port = TRUE; + conn->bits.altused = TRUE; infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n", Curl_alpnid2str(salpnid), host, conn->remote_port, Curl_alpnid2str(nalpnid), hostd, nport); diff --git a/lib/urldata.h b/lib/urldata.h index 395664d04..3129cb3ce 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -405,6 +405,7 @@ struct ConnectBits { the first time on the first connect function call */ bit close:1; /* if set, we close the connection after this request */ bit reuse:1; /* if set, this is a re-used connection */ + bit altused:1; /* this is an alt-svc "redirect" */ bit conn_to_host:1; /* if set, this connection has a "connect to host" that overrides the host in the URL */ bit conn_to_port:1; /* if set, this connection has a "connect to port" -- cgit v1.2.3