diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2017-09-05 20:02:37 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2017-09-06 15:37:56 +0200 |
commit | 24d6eded73dec427fc4a3a20cc73c94227f59c31 (patch) | |
tree | a7988faf1e154dc0517537030f5995ed1ba8d416 | |
parent | 83ce236dab867842cdba88a57db50aae0fd9a4ce (diff) | |
download | uclient-24d6eded73dec427fc4a3a20cc73c94227f59c31.tar.gz |
uclient-http: fix Host: header for literal IPv6 addresses
For literal IPv6 addresses, the host header must have the form
Host: [...]
including the square brackets, as it may also contain a port. Some
webservers ignore the missing brackets, while others will return error 400.
IPv6 addresses are determined by searching for ':' characters in the host,
as neither IPv4 addresses nor DNS names can contain colons. An alternative
would be to add a flag to the uclient_url struct; but as this struct is
exposed in public headers, such a change could be considered an ABI change,
making a backport difficult.
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Acked-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | uclient-http.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/uclient-http.c b/uclient-http.c index ac9d50f..ef8de98 100644 --- a/uclient-http.c +++ b/uclient-http.c @@ -20,6 +20,7 @@ #include <ctype.h> #include <unistd.h> #include <stdint.h> +#include <string.h> #include <fcntl.h> #include <libubox/ustream.h> @@ -562,6 +563,7 @@ uclient_http_send_headers(struct uclient_http *uh) struct uclient_url *url = uh->uc.url; struct blob_attr *cur; enum request_type req_type = uh->req_type; + bool literal_ipv6; int rem; if (uh->state >= HTTP_STATE_HEADERS_SENT) @@ -570,11 +572,15 @@ uclient_http_send_headers(struct uclient_http *uh) if (uh->uc.proxy_url) url = uh->uc.proxy_url; + literal_ipv6 = strchr(url->host, ':'); + ustream_printf(uh->us, "%s %s HTTP/1.1\r\n" - "Host: %s%s%s\r\n", - request_types[req_type], - url->location, url->host, + "Host: %s%s%s%s%s\r\n", + request_types[req_type], url->location, + literal_ipv6 ? "[" : "", + url->host, + literal_ipv6 ? "]" : "", url->port ? ":" : "", url->port ? url->port : ""); |