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
This commit is contained in:
13
lib/http.c
13
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] &&
|
||||
|
||||
Reference in New Issue
Block a user