[ipxe-devel] [PATCHv2] Include port in HTTP Host header as needed

Malte Starostik lists at malte.homeip.net
Fri Jul 15 14:31:56 UTC 2011


{On a second look, whether a port was given is already available,
which makes for a much cleaner and simpler patch.  Squash all that
flag manipulation of last night's version.  Sorry for the noise}

According to sec. 14.23 or RFC2616, a HTTP Host header without port
implies the default port is used.  Thus, when fetching from anywhere but
port 80 for HTTP or 443 for HTTPS, the port ought to be explicitly given
in that header.  Otherwise, some servers might fail to associate the
request with the correct virtual host or generate incorrect
self-referencing URLs.

As an example, this mod_perl snippet was used to include a URL to itself
in a dynamically generated boot script:
    my $base = $r->construct_url($r->parsed_uri->rpath);

Without this patch, the resulting URL lacks the port number which breaks
unless running on port 80.  Using the actual socket address isn't really
an option as this might have been fiddled with by some port redirection.
---
 src/net/tcp/http.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c
index 012b226..cee7513 100644
--- a/src/net/tcp/http.c
+++ b/src/net/tcp/http.c
@@ -662,13 +662,17 @@ static void http_step ( struct http_request *http ) {
 	if ( ( rc = xfer_printf ( &http->socket,
 				  "%s %s%s HTTP/1.1\r\n"
 				  "User-Agent: iPXE/" VERSION "\r\n"
-				  "Host: %s\r\n"
+				  "Host: %s%s%s\r\n"
 				  "%s%s%s%s%s%s%s"
 				  "\r\n",
 				  ( ( http->flags & HTTP_HEAD_ONLY ) ?
 				    "HEAD" : "GET" ),
 				  ( http->uri->path ? "" : "/" ),
 				  request, host,
+				  ( http->uri->port ?
+				    ":" : "" ),
+				  ( http->uri->port ?
+				    http->uri->port : "" ),
 				  ( ( http->flags & HTTP_KEEPALIVE ) ?
 				    "Connection: Keep-Alive\r\n" : "" ),
 				  ( partial ? "Range: bytes=" : "" ),
-- 
1.7.3.4




More information about the ipxe-devel mailing list