From 5b26cb40a9aed87c52cc984b74012fdf2d7d1027 Mon Sep 17 00:00:00 2001 From: hniksic Date: Thu, 30 Jun 2005 08:09:39 -0700 Subject: [PATCH] [svn] Explicitly document all cases when generating the Host header. --- src/ChangeLog | 5 +++++ src/http.c | 31 ++++++++++++++++++------------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 95c48edc..3087c244 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2005-06-30 Hrvoje Niksic + + * http.c (gethttp): Explicitly document the different cases when + generating the Host header. + 2005-06-30 Hrvoje Niksic * host.c (pretty_print_address): Handle error result from diff --git a/src/http.c b/src/http.c index a5f5673c..4d1c16eb 100644 --- a/src/http.c +++ b/src/http.c @@ -1308,20 +1308,25 @@ gethttp (struct url *u, struct http_stat *hs, int *dt, struct url *proxy) request_set_header (req, "Proxy-Authorization", proxyauth, rel_value); } + /* Generate the Host header, HOST:PORT. Take into account that: + + - Broken server-side software often doesn't recognize the PORT + argument, so we must generate "Host: www.server.com" instead of + "Host: www.server.com:80" (and likewise for https port). + + - IPv6 addresses contain ":", so "Host: 3ffe:8100:200:2::2:1234" + becomes ambiguous and needs to be rewritten as "Host: + [3ffe:8100:200:2::2]:1234". */ { - /* Whether we need to print the host header with braces around - host, e.g. "Host: [3ffe:8100:200:2::2]:1234" instead of the - usual "Host: symbolic-name:1234". */ - bool squares = strchr (u->host, ':') != NULL; - if (u->port == scheme_default_port (u->scheme)) - request_set_header (req, "Host", - aprintf (squares ? "[%s]" : "%s", u->host), - rel_value); - else - request_set_header (req, "Host", - aprintf (squares ? "[%s]:%d" : "%s:%d", - u->host, u->port), - rel_value); + /* Formats arranged for hfmt[add_port][add_squares]. */ + static const char *hfmt[][2] = { + { "%s", "[%s]" }, { "%s:%d", "[%s]:%d" } + }; + int add_port = u->port != scheme_default_port (u->scheme); + int add_squares = strchr (u->host, ':') != NULL; + request_set_header (req, "Host", + aprintf (hfmt[add_port][add_squares], u->host, u->port), + rel_value); } if (!inhibit_keep_alive)