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