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