shift->_build_dispatcher({
call => sub {
[
- 500, [ 'Content-type', 'text/plain' ],
- [ 'The management apologises but we have no idea how to handle that' ]
+ 404, [ 'Content-type', 'text/plain' ],
+ [ 'Not found' ]
]
}
})
use warnings FATAL => 'all';
sub UNPACKED_QUERY () { __PACKAGE__.'.unpacked_query' }
+sub UNPACKED_BODY () { __PACKAGE__.'.unpacked_body' }
sub get_unpacked_query_from {
return $_[0]->{+UNPACKED_QUERY} ||= do {
};
}
+sub get_unpacked_body_from {
+ return $_[0]->{+UNPACKED_BODY} ||= do {
+ if (($_[0]->{CONTENT_TYPE}||'') eq 'application/x-www-form-urlencoded'
+ and defined $_[0]->{CONTENT_LENGTH}) {
+ $_[0]->{'psgi.input'}->read(my $buf, $_[0]->{CONTENT_LENGTH});
+ _unpack_params($buf);
+ } else {
+ {}
+ }
+ };
+}
+
{
# shamelessly stolen from HTTP::Body::UrlEncoded by Christian Hansen
--- /dev/null
+use strict;
+use warnings FATAL => 'all';
+
+use Test::More (
+ eval { require HTTP::Request::AsCGI }
+ ? 'no_plan'
+ : (skip_all => 'No HTTP::Request::AsCGI')
+);
+
+{
+ use Web::Simple 'PostTest';
+ package PostTest;
+ dispatch [
+ sub (%foo=&bar~) {
+ $_[1]->{bar} ||= 'EMPTY';
+ [ 200,
+ [ "Content-type" => "text/plain" ],
+ [ join(' ',@{$_[1]}{qw(foo bar)}) ]
+ ]
+ },
+ ]
+}
+
+use HTTP::Request::Common qw(GET POST);
+
+my $app = PostTest->new;
+
+sub run_request {
+ my $request = shift;
+ my $c = HTTP::Request::AsCGI->new($request)->setup;
+ $app->run;
+ $c->restore;
+ return $c->response;
+}
+
+my $get = run_request(GET 'http://localhost/');
+
+cmp_ok($get->code, '==', 404, '404 on GET');
+
+my $no_body = run_request(POST 'http://localhost/');
+
+cmp_ok($no_body->code, '==', 404, '404 with empty body');
+
+my $no_foo = run_request(POST 'http://localhost/' => [ bar => 'BAR' ]);
+
+cmp_ok($no_foo->code, '==', 404, '404 with no foo param');
+
+my $no_bar = run_request(POST 'http://localhost/' => [ foo => 'FOO' ]);
+
+cmp_ok($no_bar->code, '==', 200, '200 with only foo param');
+
+is($no_bar->content, 'FOO EMPTY', 'bar defaulted');
+
+my $both = run_request(
+ POST 'http://localhost/' => [ foo => 'FOO', bar => 'BAR' ]
+);
+
+cmp_ok($both->code, '==', 200, '200 with both params');
+
+is($both->content, 'FOO BAR', 'both params returned');