[cgiapp] CGI.pm: discussing a patch to update url() behavior under mod_rewrite
Mark Stosberg
mark at summersault.com
Fri May 13 15:41:26 EDT 2011
Some of us here have been bitten by CGI.pm's behavior under mod_rewrite,
which is common to use with CGI::Application::Dispatch.
This test illustrates the issue:
###
use Test::More;
use CGI;
print "CGI: $CGI::VERSION\n";
%ENV = (
# These two are always set
'SCRIPT_NAME' => '/real/cgi-bin/dispatch.cgi',
'SCRIPT_FILENAME' => '/home/mark/real/path/cgi-bin/dispatch.cgi',
# These two are added by mod_rewrite Ref:
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
'SCRIPT_URL' => '/real/path/info',
'SCRIPT_URI' => 'http://example.com/real/path/info',
'PATH_INFO' => '/path/info',
'REQUEST_URI' => '/real/path/info',
'HTTP_HOST' => 'example.com'
);
my $q = CGI->new;
is(
$q->url( -absolute => 1, -query => 1, -path_info => 1 ),
'/real/path/info',
'$q->url( -absolute => 1, -query => 1, -path_info => 1 ) should
return complete path, even when mod_rewrite is detected.'
);
done_testing();
#####
Here's the result with 3.54:
# got: '/real'
# expected: '/real/path/info'
This behavior was not always the case. Older versions of CGI.pm ( I
happened to test with 3.05 ), gave the expected result.
There's a bug report about the current behavior here:
https://rt.cpan.org/Ticket/Display.html?id=45019
I'm evaluating accepting the proposal to address it by removing this
line in url():
undef $path if $rewrite_in_use && $rewrite; # path not valid when
rewriting active
First, I'm looking for feedback on this change. It *is* a behavior
change, so it will likely break someone's code somewhere, but on the
other hand, it restores a previous functionality, so it will "fix" the
upgrade experience for those with an old enough CGI.pm vintage.
Unlike adding another option to support both behaviors, I would rather
simply remove this code to simply things, if there's some agreement that
this is the better behavior.
Second, I'm looking for a volunteer to beef up the test coverage of
url() so that we have more regression tests for it. A starting point
might be to borrow the url() tests from CGI::Simple, and convert them to
OO style:
http://cpansearch.perl.org/src/ANDYA/CGI-Simple-1.113/t/070.standard.t
A simple "diff" is fine, but you are always welcome to fork on github
and send a pull request:
https://github.com/markstos/CGI.pm
Thanks for your feedback on this issue.
Mark
More information about the cgiapp
mailing list