Host header

Hrvoje Niksic <[email protected]> Thu, 30 Jun 2005 22:31:42 +0200
Newsgroups gmane.comp.web.wget.patches
Message-ID <[email protected]>
This explicitly documents all cases for generating the Host header.  I
wish they'd made it simpler...


2005-06-30  Hrvoje Niksic  <[email protected]>

	* http.c (gethttp): Explicitly document the different cases when
	generating the Host header.

Index: src/http.c
===================================================================
--- src/http.c	(revision 1916)
+++ src/http.c	(revision 1917)
@@ -1308,20 +1308,25 @@
 	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)