Container-Builder
view release on metacpan or search on metacpan
examples/fatpacked.plackup view on Meta::CPAN
certainly possible but not recommended: it's like doing so with
mod_perl's Apache::Request: yet too low level.
If you're writing a web application, not a framework, then you're
encouraged to use one of the web application frameworks that support
PSGI (L<http://plackperl.org/#frameworks>), or see modules like
L<HTTP::Engine> to provide higher level Request and Response API on
top of PSGI.
If you're looking for an easy-to-use API to convert existing CGI
applications to run on PSGI, consider using L<CGI::PSGI> or
L<CGI::Emulate::PSGI> as well. L<CGI::Emulate::PSGI> documentation has
a good summary of using them to convert existing CGI scripts to adapt
to PSGI.
=head1 METHODS
Some of the methods defined in the earlier versions are deprecated in
version 0.99. Take a look at L</"INCOMPATIBILITIES">.
Unless otherwise noted, all methods and attributes are B<read-only>,
and passing values to the method like an accessor doesn't work like
you expect it to.
=head2 new
Plack::Request->new( $env );
Creates a new request object.
=head1 ATTRIBUTES
=over 4
=item env
Returns the shared PSGI environment hash reference. This is a
reference, so writing to this environment passes through during the
whole PSGI request/response cycle.
=item address
Returns the IP address of the client (C<REMOTE_ADDR>).
=item remote_host
Returns the remote host (C<REMOTE_HOST>) of the client. It may be
empty, in which case you have to get the IP address using C<address>
method and resolve on your own.
=item method
Contains the request method (C<GET>, C<POST>, C<HEAD>, etc).
=item protocol
Returns the protocol (HTTP/1.0 or HTTP/1.1) used for the current request.
=item request_uri
Returns the raw, undecoded request URI path. You probably do B<NOT>
want to use this to dispatch requests.
=item path_info
Returns B<PATH_INFO> in the environment. Use this to get the local
path for the requests.
=item path
Similar to C<path_info> but returns C</> in case it is empty. In other
words, it returns the virtual path of the request URI after C<<
$req->base >>. See L</"DISPATCHING"> for details.
=item query_string
Returns B<QUERY_STRING> in the environment. This is the undecoded
query string in the request URI.
=item script_name
Returns B<SCRIPT_NAME> in the environment. This is the absolute path
where your application is hosted.
=item scheme
Returns the scheme (C<http> or C<https>) of the request.
=item secure
Returns true or false, indicating whether the connection is secure (https).
=item body, input
Returns C<psgi.input> handle.
=item session
Returns (optional) C<psgix.session> hash. When it exists, you can
retrieve and store per-session data from and to this hash.
=item session_options
Returns (optional) C<psgix.session.options> hash.
=item logger
Returns (optional) C<psgix.logger> code reference. When it exists,
your application is supposed to send the log message to this logger,
using:
$req->logger->({ level => 'debug', message => "This is a debug message" });
=item cookies
Returns a reference to a hash containing the cookies. Values are
strings that are sent by clients and are URI decoded.
If there are multiple cookies with the same name in the request, this
method will ignore the duplicates and return only the first value. If
that causes issues for you, you may have to use modules like
CGI::Simple::Cookie to parse C<< $request->header('Cookie') >> by
yourself.
=item query_parameters
Returns a reference to a hash containing query string (GET)
parameters. This hash reference is L<Hash::MultiValue> object.
=item body_parameters
Returns a reference to a hash containing posted parameters in the
request body (POST). As with C<query_parameters>, the hash
reference is a L<Hash::MultiValue> object.
=item parameters
Returns a L<Hash::MultiValue> hash reference containing (merged) GET
and POST parameters.
=item content, raw_body
Returns the request content in an undecoded byte string for POST requests.
=item uri
Returns an URI object for the current request. The URI is constructed
using various environment values such as C<SCRIPT_NAME>, C<PATH_INFO>,
C<QUERY_STRING>, C<HTTP_HOST>, C<SERVER_NAME> and C<SERVER_PORT>.
Every time this method is called it returns a new, cloned URI object.
=item base
Returns an URI object for the base path of current request. This is
like C<uri> but only contains up to C<SCRIPT_NAME> where your
application is hosted at.
Every time this method is called it returns a new, cloned URI object.
=item user
Returns C<REMOTE_USER> if it's set.
=item headers
Returns an L<HTTP::Headers::Fast> object containing the headers for the current request.
=item uploads
Returns a reference to a hash containing uploads. The hash reference
is a L<Hash::MultiValue> object and values are L<Plack::Request::Upload>
objects.
=item content_encoding
Shortcut to $req->headers->content_encoding.
=item content_length
Returns the raw value of the Content-Length header.
Before version 0.9925, this method was a shortcut for
C<< $req->headers->content_length >>.
=item content_type
Returns the raw value of the Content-Type header.
If you want just the MIME type, without any attributes like charset, use
C<< $req->headers->content_type >>. See also L<HTTP::Headers/content_type>.
Before version 0.9925, this method was a shortcut for
C<< $req->headers->content_type >>.
=item header
Shortcut to $req->headers->header.
=item referer
Shortcut to $req->headers->referer.
examples/fatpacked.plackup view on Meta::CPAN
my $env = shift;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[$env->{HTTP_FOO}],
];
},
],
[
'handle HTTP-Cookie',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo/?dankogai=kogaidan", Cookie => "foo");
is $res->code, 200;
is $res->message, 'OK';
is $res->header('content_type'), 'text/plain';
is $res->content, 'foo';
},
sub {
my $env = shift;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[$env->{HTTP_COOKIE}],
];
},
],
[
'validate env',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo/?dankogai=kogaidan");
is $res->code, 200;
is $res->message, 'OK';
is $res->header('content_type'), 'text/plain';
is $res->content, join("\n",
'REQUEST_METHOD:GET',
"SCRIPT_NAME:$ENV{PLACK_TEST_SCRIPT_NAME}",
'PATH_INFO:/foo/',
'QUERY_STRING:dankogai=kogaidan',
'SERVER_NAME:127.0.0.1',
"SERVER_PORT:" . $res->request->uri->port,
)."\n";
},
sub {
my $env = shift;
my $body;
$body .= $_ . ':' . $env->{$_} . "\n" for qw/REQUEST_METHOD SCRIPT_NAME PATH_INFO QUERY_STRING SERVER_NAME SERVER_PORT/;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[$body],
];
},
],
[
'% encoding in PATH_INFO',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo/bar%2cbaz");
is $res->content, "/foo/bar,baz", "PATH_INFO should be decoded per RFC 3875";
},
sub {
my $env = shift;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[ $env->{PATH_INFO} ],
];
},
],
[
'% double encoding in PATH_INFO',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo/bar%252cbaz");
is $res->content, "/foo/bar%2cbaz", "PATH_INFO should be decoded only once, per RFC 3875";
},
sub {
my $env = shift;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[ $env->{PATH_INFO} ],
];
},
],
[
'% encoding in PATH_INFO (outside of URI characters)',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo%E3%81%82");
is $res->content, "/foo\x{e3}\x{81}\x{82}";
},
sub {
my $env = shift;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[ $env->{PATH_INFO} ],
];
},
],
[
'SERVER_PROTOCOL is required',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo/?dankogai=kogaidan");
is $res->code, 200;
is $res->message, 'OK';
is $res->header('content_type'), 'text/plain';
like $res->content, qr{^HTTP/1\.[01]$};
},
sub {
my $env = shift;
return [
200,
[ 'Content-Type' => 'text/plain', ],
[$env->{SERVER_PROTOCOL}],
];
},
],
[
'SCRIPT_NAME should not be undef',
sub {
my $cb = shift;
my $res = $cb->(GET "http://127.0.0.1/foo/?dankogai=kogaidan");
is $res->content, 1;
},
sub {
my $env = shift;
my $cont = defined $env->{'SCRIPT_NAME'};
return [
200,
[ 'Content-Type' => 'text/plain', ],
[$cont],
];
( run in 0.543 second using v1.01-cache-2.11-cpan-df04353d9ac )