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