Kelp
view release on metacpan or search on metacpan
lib/Kelp/Response.pm view on Meta::CPAN
}
# Render advanced HTML
sub html {
my $self = shift;
$self->res->html->render("<h1>It works!</h1>");
}
# Render a mysterious JSON structure
sub json {
my $self = shift;
$self->res->json->render({ why => 'no' });
}
# Render the stock 404
sub missing {
my $self = shift;
$self->res->render_404;
}
# Render a template
sub view {
my $self = shift;
$self->res->template('view.tt', { name => 'Rick James' });
}
=head1 DESCRIPTION
The L<PSGI> specification requires that each route returns an array with status
code, headers and body. L<Plack::Response> already provides many useful methods
that deal with that. This module extends C<Plack::Response> to add the tools we
need to write graceful PSGI compliant responses. Some methods return C<$self>,
which makes them easy to chain.
=head1 ATTRIBUTES
=head2 app
A reference to the Kelp application. This will always be the real application,
not the reblessed controller.
=head2 charset
The charset to be used in response. Will be glued to C<Content-Type> header
just before the response is finalized.
NOTE: charset will be glued regardless of it having any sense with a given
C<Content-Type>, and will override any charset set explicitly through
L</set_content_type> - use with caution.
=head2 rendered
Tells if the response has been rendered. This attribute is used internally and
unless you know what you're doing, we recommend that you do not use it.
=head2 partial
Sets partial response. If this attribute is set to a true value, it will cause
C<finalize> to return the HTTP status code and headers, but not the body. This is
convenient if you intend to stream your content. In the following example, we
set C<partial> to 1 and use C<finalize> to get a C<writer> object for streaming.
sub stream {
my $self = shift;
return sub {
my $responder = shift;
# Stream JSON
$self->res->set_code(200)->json->partial(1);
# finalize will now return only the status code and headers
my $writer = $responder->($self->res->finalize);
# Stream JSON body using the writer object
for (1 .. 30) {
$writer->write(qq|{"id":$_}\n|);
sleep 1;
}
# Close the writer
$writer->close;
};
}
For more information on how to stream, see the
L<PSGI/Delayed-Response-and-Streaming-Body> docs.
=head1 METHODS
=head2 render
This method tries to act smart, without being a control freak. It will fill out
the blanks, unless they were previously filled out by someone else. Here is what
is does:
=over
=item
If the response code was not previously set, this method will set it to 200.
=item
If no content-type is previously set, C<render> will set is based on the type
of the data rendered. If it's a reference, then the content-type will be set to
C<application/json>, otherwise it will be set to C<text/html>.
# Will set the content-type to json
$res->render({ numbers => [1, 2, 3] });
=item
Last, the data will be encoded with the charset from L</charset> or the one
specified by the app - see L<Kelp/charset>. Any string you pass here should not
already be encoded, unless your application has its charset set to undef.
=back
=head2 set_content_type
Sets the content type of the response and returns C<$self>.
( run in 0.734 second using v1.01-cache-2.11-cpan-5a3173703d6 )