One of the nice things about writing a blog is getting to say 'oh, oops, I was a dumbass, let me fix that'. Today I have to own up to a big example of this.
Back at the start of WanderingThoughts , I wrote an entry where I complained in part:
In theory the absolute URL should include the port (unless it's the default). In practice, every program I've tried gleefully adds the port itself if it is a non-standard port and you're referring to the same hostname.
I was a moron .
The
Host:
header in HTTP requests includes the port when the port is a non-standard one (and some programs throw it in even when you're on port 80, as I found out later). My code looked more or less like:
newuri = "https://%s:%d" % (HostHeader, MyPort) + relUrl
When programs gave me real
Host:
headers, where
HostHeader
included both hostname and port, I effectively doubled the port and things naturally exploded. Had I printed the actual
Host:
header that programs were handing DWiki I would have seen my mistake immediately, but instead I was too confidant that I knew what was going on and didn't bother; I trusted my testing with hand-crafted HTTP requests, where I'd gotten the
Host:
header wrong and so the result looked right.
I only found all this out months later when I was doing something else with the
Host:
header that blew up because I didn't know to expect the ':port' on the end; that time I dumped debugging information, partly because the failure was more mysterious.
My mistake is all the more embarrassing because, contrary to what I wrote in the original entry , the proper behavior is described in black and white in the HTTP 1.1 RFC's section on the Host header . I am not sure what RFCs I read at the time of the original entry, but evidently I didn't read the important one.