Jim Spath wrote:
I was wondering why Catalyst::Engine::CGI::prepare_path() ignores the
port in the Host header and instead uses $ENV{SERVER_PORT}.
my $scheme = $c->request->secure ? 'https' : 'http';
my $host = $ENV{HTTP_HOST} || $ENV{SERVER_NAME};
my $port = $ENV{SERVER_PORT} || 80;
...
my $uri = $uri_proto->clone;
$uri->scheme($scheme);
$uri->host($host);
$uri->port($port);
The reason I ask is that we are running a Pound load balancer that
listens on port 80, but passes requests off to the Catalyst machines on
port 81. Pound does not pass an X_FORWARDED_HOST header, instead it
appends the port to the original Host header, and passes that through.
If Catalyst::Engine::CGI allowed URI to retrieve the port from the Host
header, which is allowed in the HTTP 1.1 spec, my problem would be solved:
$uri->host($host);
$uri->port($port) unless $uri->port;
Does this solution make sense? I could provide a patch if so... it's
obviously a tiny change. I guess the only thing I am uncertain of is if
there are situations where we do not want to use a port from the Host
header.
- Jim
I just realized that URI sets the port to 80 by default, so my change as
proposed above would not work correctly, but something like the
following could also work:
if ($host =~ /^(.+):(\d+)$/) {
$host = $1;
$port = $2;
}
_______________________________________________
List: Catalyst@lists.rawmode.org
Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.rawmode.org/
Dev site: http://dev.catalyst.perl.org/