]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - doc/bugs/Running_on_an_alternative_port_fails.mdwn
maybe [[|that page]]?
[git.ikiwiki.info.git] / doc / bugs / Running_on_an_alternative_port_fails.mdwn
index b97f64383f000c0a3e19af07b76930334efe0396..942700ba3ec30b8801bb075e038cf7a7505dc315 100644 (file)
@@ -25,47 +25,69 @@ right.
 >>>     SERVER_PORT=8181  
 >>>     HTTP_HOST=zippy0.ie0.cobbled.net  
 
+[ ... ]
+
 >>>> In apache, `HTTP_HOST` includes the port. This is not part of the CGI
 >>>> spec it seems, but perl's `CGI` module seems to rely on it,
 >>>> in `virtual_port`:
 
-<pre>
-    my $vh = $self->http('x_forwarded_host') || $self->http('host');
-    my $protocol = $self->protocol;
-    if ($vh) {
-        return ($vh =~ /:(\d+)$/)[0] || ($protocol eq 'https' ? 443 : 80);
-</pre>
+>>>>>     my $vh = $self->http('x_forwarded_host') || $self->http('host');
+>>>>>     my $protocol = $self->protocol;
+>>>>>     if ($vh) {
+>>>>>        return ($vh =~ /:(\d+)$/)[0] || ($protocol eq 'https' ? 443 : 80);
 
 >>>> The `CGI` module only looks at `SERVER_PORT` when there's no
 >>>> `HTTP_HOST`. So this is either a bug in perl's CGI or thttpd.
 >>>> --[[Joey]]
 
->>>     HTTP_ACCEPT_LANGUAGE=en-ie, en  
->>>     PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin  
->>>     SCRIPT_NAME=/cgi-bin/printenv.sh  
->>>     HTTP_USER_AGENT=Mozilla/5.0 (X11; U; Linux i686; en-ie) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+ Ubuntu/10.10 () Epiphany/2.30.2  
->>>     PWD=/home/http1/www/cgi-bin  
->>>     REQUEST_METHOD=GET  
->>>     SERVER_SOFTWARE=thttpd
->>>     SERVER_NAME=zippy0  
->>>     SERVER_PROTOCOL=HTTP/1.1  
->>>     HTTP_ACCEPT_ENCODING=gzip  
->>>     GATEWAY_INTERFACE=CGI/1.1  
->>>     CGI_PATTERN=cgi-bin/*  
->>>     HTTP_COOKIE=ikiwiki_session_c%5E2%3Fsupport%3Dtrue=bdf13df0460966a607ba497967ea5ff4  
->>>     REMOTE_ADDR=10.0.0.1  
->>>     HTTP_ACCEPT=application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5  
+[ ... ]
+
+---
+
+>>>>> This is interesting.  If HTTP_HOST is wrong then
 
->>Seems to be.  Using version from packaging system;
+>>>>> 0. the client header must be wrong (i.e. not including the PORT)
+>>>>> 0. `perl`'s doing something bad[tm] (or at least lazy)
+>>>>> 0. `apache` is adding it
+>>>>> 0. `thttpd` is stripping it
+
+>>>>> Quick hack shows that `thttpd` must be stripping the port
+number from the `Host:` header.  That can be fixed.
+
+>>>>> Thanks for the assist. -- fergus
+
+---
 
->>>     ikiwiki-3.20110905
+Patch for `thttpd-2.25b` for posterity and completeness
 
->> which I'd guess is from Apr last  year.  Will look for updates and post back if still
-wrong.
+[[!format patch """
 
->> Cheers
+diff --git a/libhttpd.c b/libhttpd.c
+index 73689be..039b7e3 100644
+--- a/libhttpd.c
++++ b/libhttpd.c
+@@ -2074,9 +2074,6 @@ httpd_parse_request( httpd_conn* hc )
+               cp = &buf[5];
+               cp += strspn( cp, " \t" );
+               hc->hdrhost = cp;
+-              cp = strchr( hc->hdrhost, ':' );
+-              if ( cp != (char*) 0 )
+-                  *cp = '\0';
+               if ( strchr( hc->hdrhost, '/' ) != (char*) 0 || hc->hdrhost[0] == '.' )
+                   {
+                   httpd_send_err( hc, 400, httpd_err400title, "", httpd_err400form, "" );
+
+"""]]
+
+-- fergus
+
+---
+
+I've gone ahead and filed a bug on CGI.pm too:
+<https://rt.cpan.org/Ticket/Display.html?id=72678> --[[Joey]] 
+
+---
 
->> -- fergus
+That'll be an interesting discussion as I'd suggest that HTTP_ headers are defined in the CGI specification as client headers and thus what `thttpd` is doing is wrong (i.e. mangling the client's own representation).  Whether a CGI client should trust HTTP_ header over the server is probably already settled by convention.
 
->> PS: all the links generated by CGI pages omit the port; this works if i login first and then
-reset the server on the 'odd' port -- hovering over the links absolute links with the port missing.
+-- fergus