use lib '.'; use t::Helper; use Mojolicious::Lite; plugin "CGI"; get "/cgi-bin/#script_name/*path_info" => {path_info => ''}, sub { my $c = shift; my $script_name = $c->stash('script_name'); $script_name = "$script_name.cgi" unless $script_name =~ /\.cgi$/; $c->cgi->run(script => File::Spec->rel2abs(cgi_script($script_name))); }; my $t = Test::Mojo->new; $t->get_ok('/cgi-bin/nope.cgi/foo')->status_is(500)->content_like(qr{Could not run CGI script}); $t->get_ok('/cgi-bin/env.cgi/some/path/info?query=123')->status_is(200) ->content_like(qr{^PATH_INFO=/some/path/info}m, 'PATH_INFO') ->content_like(qr{^QUERY_STRING=query=123}m, 'QUERY_STRING') ->content_like(qr{^SCRIPT_FILENAME=\S+/t/cgi-bin/env\.cgi$}m, 'SCRIPT_FILENAME') ->content_like(qr{^SCRIPT_NAME=/cgi-bin/env\.cgi$}m, 'SCRIPT_NAME'); $t->get_ok('/cgi-bin/env/some/path/info?query=123')->status_is(200) ->content_like(qr{^PATH_INFO=/some/path/info}m, 'PATH_INFO') ->content_like(qr{^QUERY_STRING=query=123}m, 'QUERY_STRING') ->content_like(qr{^SCRIPT_FILENAME=\S+/t/cgi-bin/env\.cgi$}m, 'SCRIPT_FILENAME') ->content_like(qr{^SCRIPT_NAME=/cgi-bin/env$}m, 'SCRIPT_NAME'); done_testing;