Release commit for 5.90123
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Response.pm
1 package Catalyst::Response;
2
3 use Moose;
4 use HTTP::Headers;
5 use Moose::Util::TypeConstraints;
6 use Scalar::Util 'blessed';
7 use Catalyst::Response::Writer;
8 use Catalyst::Utils ();
9
10 use namespace::clean -except => ['meta'];
11
12 with 'MooseX::Emulate::Class::Accessor::Fast';
13
14 our $DEFAULT_ENCODE_CONTENT_TYPE_MATCH = qr{text|xml$|javascript$};
15
16 has encodable_content_type => (
17     is => 'rw',
18     required => 1,
19     default => sub { $DEFAULT_ENCODE_CONTENT_TYPE_MATCH }
20 );
21
22 has _response_cb => (
23     is      => 'ro',
24     isa     => 'CodeRef',
25     writer  => '_set_response_cb',
26     clearer => '_clear_response_cb',
27     predicate => '_has_response_cb',
28 );
29
30 subtype 'Catalyst::Engine::Types::Writer',
31     as duck_type([qw(write close)]);
32
33 has _writer => (
34     is      => 'ro',
35     isa     => 'Catalyst::Engine::Types::Writer', #Pointless since we control how this is built
36     #writer  => '_set_writer', Now that its lazy I think this is safe to remove
37     clearer => '_clear_writer',
38     predicate => '_has_writer',
39     lazy      => 1,
40     builder => '_build_writer',
41 );
42
43 sub _build_writer {
44     my $self = shift;
45
46     ## These two lines are probably crap now...
47     $self->_context->finalize_headers unless
48       $self->finalized_headers;
49
50     my @headers;
51     $self->headers->scan(sub { push @headers, @_ });
52
53     my $writer = $self->_response_cb->([ $self->status, \@headers ]);
54     $self->_clear_response_cb;
55
56     return $writer;
57 }
58
59 has write_fh => (
60   is=>'ro',
61   predicate=>'_has_write_fh',
62   lazy=>1,
63   builder=>'_build_write_fh',
64 );
65
66 sub _build_write_fh {
67   my $writer = $_[0]->_writer; # We need to get the finalize headers side effect...
68   my $requires_encoding = $_[0]->encodable_response;
69   my %fields = (
70     _writer => $writer,
71     _context => $_[0]->_context,
72     _requires_encoding => $requires_encoding,
73   );
74
75   return bless \%fields, 'Catalyst::Response::Writer';
76 }
77
78 sub DEMOLISH {
79   my $self = shift;
80   return if $self->_has_write_fh;
81   if($self->_has_writer) {
82     $self->_writer->close
83   }
84 }
85
86 has cookies   => (is => 'rw', default => sub { {} });
87 has body      => (is => 'rw', default => undef);
88 sub has_body { defined($_[0]->body) }
89
90 has location  => (is => 'rw');
91 has status    => (is => 'rw', default => 200);
92 has finalized_headers => (is => 'rw', default => 0);
93 has headers   => (
94   is      => 'rw',
95   isa => 'HTTP::Headers',
96   handles => [qw(content_encoding content_length content_type content_type_charset header)],
97   default => sub { HTTP::Headers->new() },
98   required => 1,
99   lazy => 1,
100 );
101 has _context => (
102   is => 'rw',
103   weak_ref => 1,
104   clearer => '_clear_context',
105 );
106
107 before [qw(status headers content_encoding content_length content_type )] => sub {
108   my $self = shift;
109
110   $self->_context->log->warn(
111     "Useless setting a header value after finalize_headers and the response callback has been called." .
112     " Since we don't support tail headers this will not work as you might expect." )
113       if ( $self->_context && $self->finalized_headers && !$self->_has_response_cb && @_ );
114 };
115
116 # This has to be different since the first param to ->header is the header name and presumably
117 # you should be able to request the header even after finalization, just not try to change it.
118 before 'header' => sub {
119   my $self = shift;
120   my $header = shift;
121
122   $self->_context->log->warn(
123     "Useless setting a header value after finalize_headers and the response callback has been called." .
124     " Since we don't support tail headers this will not work as you might expect." )
125       if ( $self->_context && $self->finalized_headers && !$self->_has_response_cb && @_ );
126 };
127
128 sub output { shift->body(@_) }
129
130 sub code   { shift->status(@_) }
131
132 sub write {
133     my ( $self, $buffer ) = @_;
134
135     # Finalize headers if someone manually writes output
136     $self->_context->finalize_headers unless $self->finalized_headers;
137
138     $buffer = q[] unless defined $buffer;
139
140     if($self->encodable_response) {
141       $buffer = $self->_context->encoding->encode( $buffer, $self->_context->_encode_check )
142     }
143
144     my $len = length($buffer);
145     $self->_writer->write($buffer);
146
147     return $len;
148 }
149
150 sub unencoded_write {
151     my ( $self, $buffer ) = @_;
152
153     # Finalize headers if someone manually writes output
154     $self->_context->finalize_headers unless $self->finalized_headers;
155
156     $buffer = q[] unless defined $buffer;
157
158     my $len = length($buffer);
159     $self->_writer->write($buffer);
160
161     return $len;
162 }
163
164 sub finalize_headers {
165     my ($self) = @_;
166     return;
167 }
168
169 sub from_psgi_response {
170     my ($self, $psgi_res) = @_;
171     if(blessed($psgi_res) && $psgi_res->can('as_psgi')) {
172       $psgi_res = $psgi_res->as_psgi;
173     }
174     if(ref $psgi_res eq 'ARRAY') {
175         my ($status, $headers, $body) = @$psgi_res;
176         $self->status($status);
177         $self->headers(HTTP::Headers->new(@$headers));
178         # Can be arrayref or filehandle...
179         if(defined $body) { # probably paranoia
180           ref $body eq 'ARRAY' ? $self->body(join('', @$body)) : $self->body($body);
181         }
182     } elsif(ref $psgi_res eq 'CODE') {
183         $psgi_res->(sub {
184             my $response = shift;
185             my ($status, $headers, $maybe_body) = @$response;
186             $self->status($status);
187             $self->headers(HTTP::Headers->new(@$headers));
188             if(defined $maybe_body) {
189                 # Can be arrayref or filehandle...
190                 ref $maybe_body eq 'ARRAY' ? $self->body(join('', @$maybe_body)) : $self->body($maybe_body);
191             } else {
192                 return $self->write_fh;
193             }
194         });
195      } else {
196         die "You can't set a Catalyst response from that, expect a valid PSGI response";
197     }
198
199     # Encoding compatibilty.   If the response set a charset, well... we need
200     # to assume its properly encoded and NOT encode for this response.  Otherwise
201     # We risk double encoding.
202     if($self->content_type_charset) {
203       # We have to do this since for backcompat reasons having a charset doesn't always
204       # mean that the body is already encoded :(
205       $self->_context->clear_encoding;
206     }
207 }
208
209 =head1 NAME
210
211 Catalyst::Response - stores output responding to the current client request
212
213 =head1 SYNOPSIS
214
215     $res = $c->response;
216     $res->body;
217     $res->code;
218     $res->content_encoding;
219     $res->content_length;
220     $res->content_type;
221     $res->cookies;
222     $res->header;
223     $res->headers;
224     $res->output;
225     $res->redirect;
226     $res->status;
227     $res->write;
228
229 =head1 DESCRIPTION
230
231 This is the Catalyst Response class, which provides methods for responding to
232 the current client request. The appropriate L<Catalyst::Engine> for your environment
233 will turn the Catalyst::Response into a HTTP Response and return it to the client.
234
235 =head1 METHODS
236
237 =head2 $res->body( $text | $fh | $iohandle_object )
238
239     $c->response->body('Catalyst rocks!');
240
241 Sets or returns the output (text or binary data). If you are returning a large body,
242 you might want to use a L<IO::Handle> type of object (Something that implements the getline method
243 in the same fashion), or a filehandle GLOB. These will be passed down to the PSGI
244 handler you are using and might be optimized using server specific abilities (for
245 example L<Twiggy> will attempt to server a real local file in a non blocking manner).
246
247 If you are using a filehandle as the body response you are responsible for
248 making sure it conforms to the L<PSGI> specification with regards to content
249 encoding.  Unlike with scalar body values or when using the streaming interfaces
250 we currently do not attempt to normalize and encode your filehandle.  In general
251 this means you should be sure to be sending bytes not UTF8 decoded multibyte
252 characters.
253
254 Most of the time when you do:
255
256     open(my $fh, '<:raw', $path);
257
258 You should be fine.  If you open a filehandle with a L<PerlIO> layer you probably
259 are not fine.  You can usually fix this by explicitly using binmode to set
260 the IOLayer to :raw.  Its possible future versions of L<Catalyst> will try to
261 'do the right thing'.
262
263 When using a L<IO::Handle> type of object and no content length has been
264 already set in the response headers Catalyst will make a reasonable attempt
265 to determine the size of the Handle. Depending on the implementation of your
266 handle object, setting the content length may fail. If it is at all possible
267 for you to determine the content length of your handle object,
268 it is recommended that you set the content length in the response headers
269 yourself, which will be respected and sent by Catalyst in the response.
270
271 Please note that the object needs to implement C<getline>, not just
272 C<read>.  Older versions of L<Catalyst> expected your filehandle like objects
273 to do read.  If you have code written for this expectation and you cannot
274 change the code to meet the L<PSGI> specification, you can try the following
275 middleware L<Plack::Middleware::AdaptFilehandleRead> which will attempt to
276 wrap your object in an interface that so conforms.
277
278 Starting from version 5.90060, when using an L<IO::Handle> object, you
279 may want to use L<Plack::Middleware::XSendfile>, to delegate the
280 actual serving to the frontend server. To do so, you need to pass to
281 C<body> an IO object with a C<path> method. This can be achieved in
282 two ways.
283
284 Either using L<Plack::Util>:
285
286   my $fh = IO::File->new($file, 'r');
287   Plack::Util::set_io_path($fh, $file);
288
289 Or using L<IO::File::WithPath>
290
291   my $fh = IO::File::WithPath->new($file, 'r');
292
293 And then passing the filehandle to body and setting headers, if needed.
294
295   $c->response->body($fh);
296   $c->response->headers->content_type('text/plain');
297   $c->response->headers->content_length(-s $file);
298   $c->response->headers->last_modified((stat($file))[9]);
299
300 L<Plack::Middleware::XSendfile> can be loaded in the application so:
301
302  __PACKAGE__->config(
303      psgi_middleware => [
304          'XSendfile',
305          # other middlewares here...
306         ],
307  );
308
309 B<Beware> that loading the middleware without configuring the
310 webserver to set the request header C<X-Sendfile-Type> to a supported
311 type (C<X-Accel-Redirect> for nginx, C<X-Sendfile> for Apache and
312 Lighttpd), could lead to the disclosure of private paths to malicious
313 clients setting that header.
314
315 Nginx needs the additional X-Accel-Mapping header to be set in the
316 webserver configuration, so the middleware will replace the absolute
317 path of the IO object with the internal nginx path. This is also
318 useful to prevent a buggy app to server random files from the
319 filesystem, as it's an internal redirect.
320
321 An nginx configuration for FastCGI could look so:
322
323  server {
324      server_name example.com;
325      root /my/app/root;
326      location /private/repo/ {
327          internal;
328          alias /my/app/repo/;
329      }
330      location /private/staging/ {
331          internal;
332          alias /my/app/staging/;
333      }
334      location @proxy {
335          include /etc/nginx/fastcgi_params;
336          fastcgi_param SCRIPT_NAME '';
337          fastcgi_param PATH_INFO   $fastcgi_script_name;
338          fastcgi_param HTTP_X_SENDFILE_TYPE X-Accel-Redirect;
339          fastcgi_param HTTP_X_ACCEL_MAPPING /my/app=/private;
340          fastcgi_pass  unix:/my/app/run/app.sock;
341     }
342  }
343
344 In the example above, passing filehandles with a local path matching
345 /my/app/staging or /my/app/repo will be served by nginx. Passing paths
346 with other locations will lead to an internal server error.
347
348 Setting the body to a filehandle without the C<path> method bypasses
349 the middleware completely.
350
351 For Apache and Lighttpd, the mapping doesn't apply and setting the
352 X-Sendfile-Type is enough.
353
354 =head2 $res->has_body
355
356 Predicate which returns true when a body has been set.
357
358 =head2 $res->code
359
360 Alias for $res->status.
361
362 =head2 $res->content_encoding
363
364 Shortcut for $res->headers->content_encoding.
365
366 =head2 $res->content_length
367
368 Shortcut for $res->headers->content_length.
369
370 =head2 $res->content_type
371
372 Shortcut for $res->headers->content_type.
373
374 This value is typically set by your view or plugin. For example,
375 L<Catalyst::Plugin::Static::Simple> will guess the mime type based on the file
376 it found, while L<Catalyst::View::TT> defaults to C<text/html>.
377
378 =head2 $res->content_type_charset
379
380 Shortcut for $res->headers->content_type_charset;
381
382 =head2 $res->cookies
383
384 Returns a reference to a hash containing cookies to be set. The keys of the
385 hash are the cookies' names, and their corresponding values are hash
386 references used to construct a L<CGI::Simple::Cookie> object.
387
388     $c->response->cookies->{foo} = { value => '123' };
389
390 The keys of the hash reference on the right correspond to the L<CGI::Simple::Cookie>
391 parameters of the same name, except they are used without a leading dash.
392 Possible parameters are:
393
394 =over
395
396 =item value
397
398 =item expires
399
400 =item domain
401
402 =item path
403
404 =item secure
405
406 =item httponly
407
408 =back
409
410 =head2 $res->header
411
412 Shortcut for $res->headers->header.
413
414 =head2 $res->headers
415
416 Returns an L<HTTP::Headers> object, which can be used to set headers.
417
418     $c->response->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
419
420 =head2 $res->output
421
422 Alias for $res->body.
423
424 =head2 $res->redirect( $url, $status )
425
426 Causes the response to redirect to the specified URL. The default status is
427 C<302>.
428
429     $c->response->redirect( 'http://slashdot.org' );
430     $c->response->redirect( 'http://slashdot.org', 307 );
431
432 This is a convenience method that sets the Location header to the
433 redirect destination, and then sets the response status.  You will
434 want to C< return > or C<< $c->detach() >> to interrupt the normal
435 processing flow if you want the redirect to occur straight away.
436
437 B<Note:> do not give a relative URL as $url, i.e: one that is not fully
438 qualified (= C<http://...>, etc.) or that starts with a slash
439 (= C</path/here>). While it may work, it is not guaranteed to do the right
440 thing and is not a standard behaviour. You may opt to use uri_for() or
441 uri_for_action() instead.
442
443 B<Note:> If $url is an object that does ->as_string (such as L<URI>, which is
444 what you get from ->uri_for) we automatically call that to stringify.  This
445 should ease the common case usage
446
447     return $c->res->redirect( $c->uri_for(...));
448
449 =cut
450
451 sub redirect {
452     my $self = shift;
453
454     if (@_) {
455         my $location = shift;
456         my $status   = shift || 302;
457
458         if(blessed($location) && $location->can('as_string')) {
459             $location = $location->as_string;
460         }
461
462         $self->location($location);
463         $self->status($status);
464     }
465
466     return $self->location;
467 }
468
469 =head2 $res->location
470
471 Sets or returns the HTTP 'Location'.
472
473 =head2 $res->status
474
475 Sets or returns the HTTP status.
476
477     $c->response->status(404);
478
479 $res->code is an alias for this, to match HTTP::Response->code.
480
481 =head2 $res->write( $data )
482
483 Writes $data to the output stream.  Calling this method will finalize your
484 headers and send the headers and status code response to the client (so changing
485 them afterwards is a waste... be sure to set your headers correctly first).
486
487 You may call this as often as you want throughout your response cycle.  You may
488 even set a 'body' afterward.  So for example you might write your HTTP headers
489 and the HEAD section of your document and then set the body from a template
490 driven from a database.  In some cases this can seem to the client as if you had
491 a faster overall response (but note that unless your server support chunked
492 body your content is likely to get queued anyway (L<Starman> and most other
493 http 1.1 webservers support this).
494
495 If there is an encoding set, we encode each line of the response (the default
496 encoding is UTF-8).
497
498 =head2 $res->unencoded_write( $data )
499
500 Works just like ->write but we don't apply any content encoding to C<$data>.  Use
501 this if you are already encoding the $data or the data is arriving from an encoded
502 storage.
503
504 =head2 $res->write_fh
505
506 Returns an instance of L<Catalyst::Response::Writer>, which is a lightweight
507 decorator over the PSGI C<$writer> object (see L<PSGI.pod\Delayed-Response-and-Streaming-Body>).
508
509 In addition to proxying the C<write> and C<close> method from the underlying PSGI
510 writer, this proxy object knows any application wide encoding, and provides a method
511 C<write_encoded> that will properly encode your written lines based upon your
512 encoding settings.  By default in L<Catalyst> responses are UTF-8 encoded and this
513 is the encoding used if you respond via C<write_encoded>.  If you want to handle
514 encoding yourself, you can use the C<write> method directly.
515
516 Encoding only applies to content types for which it matters.  Currently the following
517 content types are assumed to need encoding: text (including HTML), xml and javascript.
518
519 We provide access to this object so that you can properly close over it for use in
520 asynchronous and nonblocking applications.  For example (assuming you are using a supporting
521 server, like L<Twiggy>:
522
523     package AsyncExample::Controller::Root;
524
525     use Moose;
526
527     BEGIN { extends 'Catalyst::Controller' }
528
529     sub prepare_cb {
530       my $write_fh = pop;
531       return sub {
532         my $message = shift;
533         $write_fh->write("Finishing: $message\n");
534         $write_fh->close;
535       };
536     }
537
538     sub anyevent :Local :Args(0) {
539       my ($self, $c) = @_;
540       my $cb = $self->prepare_cb($c->res->write_fh);
541
542       my $watcher;
543       $watcher = AnyEvent->timer(
544         after => 5,
545         cb => sub {
546           $cb->(scalar localtime);
547           undef $watcher; # cancel circular-ref
548         });
549     }
550
551 Like the 'write' method, calling this will finalize headers. Unlike 'write' when you
552 can this it is assumed you are taking control of the response so the body is never
553 finalized (there isn't one anyway) and you need to call the close method.
554
555 =head2 $res->print( @data )
556
557 Prints @data to the output stream, separated by $,.  This lets you pass
558 the response object to functions that want to write to an L<IO::Handle>.
559
560 =head2 $res->finalize_headers()
561
562 Writes headers to response if not already written
563
564 =head2 from_psgi_response
565
566 Given a PSGI response (either three element ARRAY reference OR coderef expecting
567 a $responder) set the response from it.
568
569 Properly supports streaming and delayed response and / or async IO if running
570 under an expected event loop.
571
572 If passed an object, will expect that object to do a method C<as_psgi>.
573
574 Example:
575
576     package MyApp::Web::Controller::Test;
577
578     use base 'Catalyst::Controller';
579     use Plack::App::Directory;
580
581
582     my $app = Plack::App::Directory->new({ root => "/path/to/htdocs" })
583       ->to_app;
584
585     sub myaction :Local Args {
586       my ($self, $c) = @_;
587       $c->res->from_psgi_response($app->($c->req->env));
588     }
589
590 Please note this does not attempt to map or nest your PSGI application under
591 the Controller and Action namespace or path. You may wish to review 'PSGI Helpers'
592 under L<Catalyst::Utils> for help in properly nesting applications.
593
594 B<NOTE> If your external PSGI application returns a response that has a character
595 set associated with the content type (such as "text/html; charset=UTF-8") we set
596 $c->clear_encoding to remove any additional content type encoding processing later
597 in the application (this is done to avoid double encoding issues).
598
599 =head2 encodable_content_type
600
601 This is a regular expression used to determine of the current content type
602 should be considered encodable.  Currently we apply default encoding (usually
603 UTF8) to text type contents.  Here's the default regular expression:
604
605 This would match content types like:
606
607     text/plain
608     text/html
609     text/xml
610     application/javascript
611     application/xml
612     application/vnd.user+xml
613
614 B<NOTE>: We don't encode JSON content type responses by default since most
615 of the JSON serializers that are commonly used for this task will do so
616 automatically and we don't want to double encode.  If you are not using a
617 tool like L<JSON> to produce JSON type content, (for example you are using
618 a template system, or creating the strings manually) you will need to either
619 encoding the body yourself:
620
621     $c->response->body( $c->encoding->encode( $body, $c->_encode_check ) );
622
623 Or you can alter the regular expression using this attribute.
624
625 =head2 encodable_response
626
627 Given a L<Catalyst::Response> return true if its one that can be encoded.
628
629      make sure there is an encoding set on the response
630      make sure the content type is encodable
631      make sure no content type charset has been already set to something different from the global encoding
632      make sure no content encoding is present.
633
634 Note this does not inspect a body since we do allow automatic encoding on streaming
635 type responses.
636
637 =cut
638
639 sub encodable_response {
640   my ($self) = @_;
641   return 0 unless $self->_context; # Cases like returning a HTTP Exception response you don't have a context here...
642   return 0 unless $self->_context->encoding;
643
644   # The response is considered to have a 'manual charset' when a charset is already set on
645   # the content type of the response AND it is not the same as the one we set in encoding.
646   # If there is no charset OR we are asking for the one which is the same as the current
647   # required encoding, that is a flag that we want Catalyst to encode the response automatically.
648   my $has_manual_charset = 0;
649   if(my $charset = $self->content_type_charset) {
650     $has_manual_charset = (uc($charset) ne uc($self->_context->encoding->mime_name)) ? 1:0;
651   }
652
653   # Content type is encodable if it matches the regular expression stored in this attribute
654   my $encodable_content_type = $self->content_type =~ m/${\$self->encodable_content_type}/ ? 1:0;
655
656   # The content encoding is allowed (for charset encoding) only if its empty or is set to identity
657   my $allowed_content_encoding = (!$self->content_encoding || $self->content_encoding eq 'identity') ? 1:0;
658
659   # The content type must be an encodable type, and there must be NO manual charset and also
660   # the content encoding must be the allowed values;
661   if(
662       $encodable_content_type and
663       !$has_manual_charset and
664       $allowed_content_encoding
665   ) {
666     return 1;
667   } else {
668     return 0;
669   }
670 }
671
672 =head2 DEMOLISH
673
674 Ensures that the response is flushed and closed at the end of the
675 request.
676
677 =head2 meta
678
679 Provided by Moose
680
681 =cut
682
683 sub print {
684     my $self = shift;
685     my $data = shift;
686
687     defined $self->write($data) or return;
688
689     for (@_) {
690         defined $self->write($,) or return;
691         defined $self->write($_) or return;
692     }
693     defined $self->write($\) or return;
694
695     return 1;
696 }
697
698 =head1 AUTHORS
699
700 Catalyst Contributors, see Catalyst.pm
701
702 =head1 COPYRIGHT
703
704 This library is free software. You can redistribute it and/or modify
705 it under the same terms as Perl itself.
706
707 =cut
708
709 __PACKAGE__->meta->make_immutable;
710
711 1;