[Catalyst] Re: Incorrect $c->req->base using Catalyst::Engine::SCGI
on Win32
Will Hawes
wdhawes at gmail.com
Tue Jun 30 13:51:10 GMT 2009
2009/6/28 Orlando Vazquez <ovazquez at gmail.com>:
> Ok, just to make sure I understand the root cause of this problem:
> Apache2.0 at Win32 sets SCRIPT_NAME to "/action" (or whatever PATH_INFO
> is), when it should really be something like "", "/" or undef, is this
> correct? I assume this only happens when the application is mounted
> under "/", and it does do the right this when mounted under say,
> something like "/myapp"?
That's correct, the problem only happens when mounted at "/" - things
behave as expected when mounted elsewhere.
> I'm the one who was responsible for removing the prepare_path method
> from the SCGI engine. I did this because it was overriding with an
> outdated verbatim copy of the prepare_path method in C::E::CGI, which
> ::SCGI inherits from. Hmmm, ::FastCGI seems to include its own
> additional path fixes :\ Does it make sense to unify these tweaks in
> one place?
Almost certainly, although if you are in agreement I'd settle for
getting it working within C::E::SCGI in the first instance and
worrying about that later when I have some more time ;)
> Do you know if this problem manifests itself under the same webserver
> but different Catalyst engine?
Without having tested extensively, I think it's SCGI specific - I
don't see the problem with the CGI engine, at least.
> I appreciate the suggested fix but I don't think it's quite safe, as
> it would break something like /tags/tags where your app is mounted
> under "/tags" and you're calling the "/tags" action (you know, for
> whatever reason).
>
> But at the end of the day we have to get this to
> work well for you, so I'm not thrilled about but also not opposed to
> escaping this behaviour for this particular webserver since I know
> there's a few different servers that get it wrong.
>
> Could you check out how C::E::FastCGI::_fix_env for how to escape this
> for your particular webserver platform + version, and patch/commit a
> unittest+fix? I don't have a windows machine handy to test this
> appropriately, but you could probably fix this in a couple of minutes.
Good point, I'd not thought of the /tags/tags scenario.
Having played around with this a little more it looks as though when
things are working properly, REQUEST_URI is the same as SCRIPT_NAME
concatenated with PATH_INFO. With that in mind, perhaps revising the
suggested fix to something like this:
sub prepare_path { # or _fix_env?
my( $self, $c ) = @_;
my $env = $self->env;
my $path_info = $env->{PATH_INFO} || '';
my $script_name = $env->{SCRIPT_NAME} || '';
my $request_uri = $env->{REQUEST_URI} || '';
unless( $request_uri eq $script_name . $path_info ) {
delete $env->{SCRIPT_NAME};
}
return $self->next::method( $c );
}
To be absolutely safe we could limit it to just this OS/web server as
you suggest:
if( $^O eq 'MSWin32' && $env->{SERVER_SOFTWARE} =~ m{^Apache/2\.0\.63} ) {
...
}
Let me know your thoughts on the above and I'll get to work on it.
> P.S.
>
> I got your doc bug report - it's been fixed and pushed up to the
> Catalyst git repo :)
Thanks :)
More information about the Catalyst
mailing list