diff options
author | Daniel Stenberg <daniel@haxx.se> | 2015-03-12 00:50:46 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2015-03-12 12:15:24 +0100 |
commit | a5d994941c2b19a3c63402caa064c9683647de05 (patch) | |
tree | 85959d076a4709eeb23afb78348476f47a1cc9c5 /lib | |
parent | 143acd6222319e9cf2e355fdc27c07e4e955e403 (diff) |
http: always send Host: header as first header
...after the method line:
"Since the Host field-value is critical information for handling a
request, a user agent SHOULD generate Host as the first header field
following the request-line." / RFC 7230 section 5.4
Additionally, this will also make libcurl ignore multiple specified
custom Host: headers and only use the first one. Test 1121 has been
updated accordingly
Bug: http://curl.haxx.se/bug/view.cgi?id=1491
Reported-by: Rainer Canavan
Diffstat (limited to 'lib')
-rw-r--r-- | lib/http.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/http.c b/lib/http.c index dff164b5e..74c9b5737 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2016,7 +2016,14 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } #endif - conn->allocptr.host = NULL; + if(strcmp("Host:", ptr)) { + conn->allocptr.host = aprintf("%s\r\n", ptr); + if(!conn->allocptr.host) + return CURLE_OUT_OF_MEMORY; + } + else + /* when clearing the header */ + conn->allocptr.host = NULL; } else { /* When building Host: headers, we must put the host name within @@ -2285,11 +2292,11 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) Curl_add_bufferf(req_buffer, "%s" /* ftp typecode (;type=x) */ " HTTP/%s\r\n" /* HTTP version */ + "%s" /* host */ "%s" /* proxyuserpwd */ "%s" /* userpwd */ "%s" /* range */ "%s" /* user agent */ - "%s" /* host */ "%s" /* accept */ "%s" /* TE: */ "%s" /* accept-encoding */ @@ -2299,6 +2306,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) ftp_typecode, httpstring, + (conn->allocptr.host?conn->allocptr.host:""), conn->allocptr.proxyuserpwd? conn->allocptr.proxyuserpwd:"", conn->allocptr.userpwd?conn->allocptr.userpwd:"", @@ -2308,7 +2316,6 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) *data->set.str[STRING_USERAGENT] && conn->allocptr.uagent)? conn->allocptr.uagent:"", - (conn->allocptr.host?conn->allocptr.host:""), http->p_accept?http->p_accept:"", conn->allocptr.te?conn->allocptr.te:"", (data->set.str[STRING_ENCODING] && |