1 package HTTP::Response;
4 @ISA = qw(HTTP::Message);
14 my($class, $rc, $msg, $header, $content) = @_;
15 my $self = $class->SUPER::new($header, $content);
24 my($class, $str) = @_;
26 if ($str =~ s/^(.*)\n//) {
34 my $self = $class->SUPER::parse($str);
35 my($protocol, $code, $message);
36 if ($status_line =~ /^\d{3} /) {
37 # Looks like a response created by HTTP::Response->new
38 ($code, $message) = split(' ', $status_line, 2);
40 ($protocol, $code, $message) = split(' ', $status_line, 3);
42 $self->protocol($protocol) if $protocol;
43 $self->code($code) if defined($code);
44 $self->message($message) if defined($message);
52 my $clone = bless $self->SUPER::clone, ref($self);
53 $clone->code($self->code);
54 $clone->message($self->message);
55 $clone->request($self->request->clone) if $self->request;
56 # we don't clone previous
61 sub code { shift->_elem('_rc', @_); }
62 sub message { shift->_elem('_msg', @_); }
63 sub previous { shift->_elem('_previous',@_); }
64 sub request { shift->_elem('_request', @_); }
70 my $code = $self->{'_rc'} || "000";
71 my $mess = $self->{'_msg'} || HTTP::Status::status_message($code) || "Unknown code";
79 my $base = $self->header('Content-Base') || # used to be HTTP/1.1
80 $self->header('Content-Location') || # HTTP/1.1
81 $self->header('Base'); # HTTP/1.0
82 if ($base && $base =~ /^$URI::scheme_re:/o) {
84 return $HTTP::URI_CLASS->new($base);
87 my $req = $self->request;
89 # if $base is undef here, the return value is effectively
90 # just a copy of $self->request->uri.
91 return $HTTP::URI_CLASS->new_abs($base, $req->uri);
94 # can't find an absolute base
103 while (my $p = $r->previous) {
107 return @r unless wantarray;
117 my $cd = $self->header('Content-Disposition');
119 require HTTP::Headers::Util;
120 if (my @cd = HTTP::Headers::Util::split_header_words($cd)) {
121 my ($disposition, undef, %cd_param) = @{$cd[-1]};
122 $file = $cd_param{filename};
125 if ($file && $file =~ /^=\?(.+?)\?(.+?)\?(.+)\?=$/) {
127 my $encoding = uc($2);
130 if ($encoding eq 'Q' || $encoding eq 'B') {
131 local($SIG{__DIE__});
133 if ($encoding eq 'Q') {
135 require MIME::QuotedPrint;
136 $encfile = MIME::QuotedPrint::decode($encfile);
138 else { # $encoding eq 'B'
139 require MIME::Base64;
140 $encfile = MIME::Base64::decode($encfile);
145 # This is ugly use of non-public API, but is there
146 # a better way to accomplish what we want (locally
147 # as-is usable filename string)?
148 my $locale_charset = encoding::_get_locale_encoding();
149 Encode::from_to($encfile, $charset, $locale_charset);
152 $file = $encfile unless $@;
159 unless (defined($file) && length($file)) {
160 if (my $cl = $self->header('Content-Location')) {
161 $uri = URI->new($cl);
163 elsif (my $request = $self->request) {
164 $uri = $request->uri;
168 $file = ($uri->path_segments)[-1];
173 $file =~ s,.*[\\/],,; # basename
176 if ($file && !length($file)) {
186 require HTTP::Status;
189 $eol = "\n" unless defined $eol;
191 my $status_line = $self->status_line;
192 my $proto = $self->protocol;
193 $status_line = "$proto $status_line" if $proto;
195 return join($eol, $status_line, $self->SUPER::as_string(@_));
203 my $status_line = $self->status_line;
204 my $proto = $self->protocol;
205 $status_line = "$proto $status_line" if $proto;
207 return $self->SUPER::dump(
208 preheader => $status_line,
214 sub is_info { HTTP::Status::is_info (shift->{'_rc'}); }
215 sub is_success { HTTP::Status::is_success (shift->{'_rc'}); }
216 sub is_redirect { HTTP::Status::is_redirect (shift->{'_rc'}); }
217 sub is_error { HTTP::Status::is_error (shift->{'_rc'}); }
222 require HTML::Entities;
224 my $title = 'An Error Occurred';
225 my $body = HTML::Entities::encode($self->status_line);
228 <head><title>$title</title></head>
243 # Implementation of RFC 2616 section 13.2.3
245 my $response_time = $self->client_date;
246 my $date = $self->date;
249 if ($response_time && $date) {
250 $age = $response_time - $date; # apparent_age
251 $age = 0 if $age < 0;
254 my $age_v = $self->header('Age');
255 if ($age_v && $age_v > $age) {
256 $age = $age_v; # corrected_received_age
259 if ($response_time) {
260 my $request = $self->request;
262 my $request_time = $request->date;
263 if ($request_time && $request_time < $response_time) {
264 # Add response_delay to age to get 'corrected_initial_age'
265 $age += $response_time - $request_time;
268 $age += ($time || time) - $response_time;
274 sub freshness_lifetime
276 my($self, %opt) = @_;
278 # First look for the Cache-Control: max-age=n header
279 for my $cc ($self->header('Cache-Control')) {
280 for my $cc_dir (split(/\s*,\s*/, $cc)) {
281 return $1 if $cc_dir =~ /^max-age\s*=\s*(\d+)/i;
285 # Next possibility is to look at the "Expires" header
286 my $date = $self->date || $self->client_date || $opt{time} || time;
287 if (my $expires = $self->expires) {
288 return $expires - $date;
291 # Must apply heuristic expiration
292 return undef if exists $opt{heuristic_expiry} && !$opt{heuristic_expiry};
294 # Default heuristic expiration parameters
296 $opt{h_max} ||= 24 * 3600;
297 $opt{h_lastmod_fraction} ||= 0.10; # 10% since last-mod suggested by RFC2616
298 $opt{h_default} ||= 3600;
300 # Should give a warning if more than 24 hours according to
301 # RFC 2616 section 13.2.4. Here we just make this the default
304 if (my $last_modified = $self->last_modified) {
305 my $h_exp = ($date - $last_modified) * $opt{h_lastmod_fraction};
306 return $opt{h_min} if $h_exp < $opt{h_min};
307 return $opt{h_max} if $h_exp > $opt{h_max};
311 # default when all else fails
312 return $opt{h_min} if $opt{h_min} > $opt{h_default};
313 return $opt{h_default};
319 my($self, %opt) = @_;
321 my $f = $self->freshness_lifetime(%opt);
322 return undef unless defined($f);
323 return $f > $self->current_age($opt{time});
329 my($self, %opt) = @_;
331 my $f = $self->freshness_lifetime(%opt);
332 return undef unless defined($f);
333 return $f - $self->current_age($opt{time}) + $opt{time};
343 HTTP::Response - HTTP style response message
347 Response objects are returned by the request() method of the C<LWP::UserAgent>:
350 $response = $ua->request($request)
351 if ($response->is_success) {
352 print $response->content;
355 print STDERR $response->status_line, "\n";
360 The C<HTTP::Response> class encapsulates HTTP style responses. A
361 response consists of a response line, some headers, and a content
362 body. Note that the LWP library uses HTTP style responses even for
363 non-HTTP protocol schemes. Instances of this class are usually
364 created and returned by the request() method of an C<LWP::UserAgent>
367 C<HTTP::Response> is a subclass of C<HTTP::Message> and therefore
368 inherits its methods. The following additional methods are available:
372 =item $r = HTTP::Response->new( $code )
374 =item $r = HTTP::Response->new( $code, $msg )
376 =item $r = HTTP::Response->new( $code, $msg, $header )
378 =item $r = HTTP::Response->new( $code, $msg, $header, $content )
380 Constructs a new C<HTTP::Response> object describing a response with
381 response code $code and optional message $msg. The optional $header
382 argument should be a reference to an C<HTTP::Headers> object or a
383 plain array reference of key/value pairs. The optional $content
384 argument should be a string of bytes. The meaning these arguments are
387 =item $r = HTTP::Response->parse( $str )
389 This constructs a new response object by parsing the given string.
393 =item $r->code( $code )
395 This is used to get/set the code attribute. The code is a 3 digit
396 number that encode the overall outcome of a HTTP response. The
397 C<HTTP::Status> module provide constants that provide mnemonic names
398 for the code attribute.
402 =item $r->message( $message )
404 This is used to get/set the message attribute. The message is a short
405 human readable single line string that explains the response code.
407 =item $r->header( $field )
409 =item $r->header( $field => $value )
411 This is used to get/set header values and it is inherited from
412 C<HTTP::Headers> via C<HTTP::Message>. See L<HTTP::Headers> for
413 details and other similar methods that can be used to access the
418 =item $r->content( $bytes )
420 This is used to get/set the raw content and it is inherited from the
421 C<HTTP::Message> base class. See L<HTTP::Message> for details and
422 other methods that can be used to access the content.
424 =item $r->decoded_content( %options )
426 This will return the content after any C<Content-Encoding> and
427 charsets have been decoded. See L<HTTP::Message> for details.
431 =item $r->request( $request )
433 This is used to get/set the request attribute. The request attribute
434 is a reference to the the request that caused this response. It does
435 not have to be the same request passed to the $ua->request() method,
436 because there might have been redirects and authorization retries in
441 =item $r->previous( $response )
443 This is used to get/set the previous attribute. The previous
444 attribute is used to link together chains of responses. You get
445 chains of responses if the first response is redirect or unauthorized.
446 The value is C<undef> if this is the first response in a chain.
448 Note that the method $r->redirects is provided as a more convenient
449 way to access the response chain.
451 =item $r->status_line
453 Returns the string "E<lt>code> E<lt>message>". If the message attribute
454 is not set then the official name of E<lt>code> (see L<HTTP::Status>)
459 Returns the base URI for this response. The return value will be a
460 reference to a URI object.
462 The base URI is obtained from one the following sources (in priority
469 Embedded in the document content, for instance <BASE HREF="...">
474 A "Content-Base:" or a "Content-Location:" header in the response.
476 For backwards compatibility with older HTTP implementations we will
477 also look for the "Base:" header.
481 The URI used to request this response. This might not be the original
482 URI that was passed to $ua->request() method, because we might have
483 received some redirect responses first.
487 If none of these sources provide an absolute URI, undef is returned.
489 When the LWP protocol modules produce the HTTP::Response object, then
490 any base URI embedded in the document (step 1) will already have
491 initialized the "Content-Base:" header. This means that this method
492 only performs the last 2 steps (the content is not always available
497 Returns a filename for this response. Note that doing sanity checks
498 on the returned filename (eg. removing characters that cannot be used
499 on the target filesystem where the filename would be used, and
500 laundering it for security purposes) are the caller's responsibility;
501 the only related thing done by this method is that it makes a simple
502 attempt to return a plain filename with no preceding path segments.
504 The filename is obtained from one the following sources (in priority
511 A "Content-Disposition:" header in the response. Proper decoding of
512 RFC 2047 encoded filenames requires the C<MIME::QuotedPrint> (for "Q"
513 encoding), C<MIME::Base64> (for "B" encoding), and C<Encode> modules.
517 A "Content-Location:" header in the response.
521 The URI used to request this response. This might not be the original
522 URI that was passed to $ua->request() method, because we might have
523 received some redirect responses first.
527 If a filename cannot be derived from any of these sources, undef is
532 =item $r->as_string( $eol )
534 Returns a textual representation of the response.
540 =item $r->is_redirect
544 These methods indicate if the response was informational, successful, a
545 redirection, or an error. See L<HTTP::Status> for the meaning of these.
547 =item $r->error_as_HTML
549 Returns a string containing a complete HTML document indicating what
550 error occurred. This method should only be called when $r->is_error
555 Returns the list of redirect responses that lead up to this response
556 by following the $r->previous chain. The list order is oldest first.
558 In scalar context return the number of redirect responses leading up
561 =item $r->current_age
563 Calculates the "current age" of the response as specified by RFC 2616
564 section 13.2.3. The age of a response is the time since it was sent
565 by the origin server. The returned value is a number representing the
568 =item $r->freshness_lifetime( %opt )
570 Calculates the "freshness lifetime" of the response as specified by
571 RFC 2616 section 13.2.4. The "freshness lifetime" is the length of
572 time between the generation of a response and its expiration time.
573 The returned value is the number of seconds until expiry.
575 If the response does not contain an "Expires" or a "Cache-Control"
576 header, then this function will apply some simple heuristic based on
577 the "Last-Modified" header to determine a suitable lifetime. The
578 following options might be passed to control the heuristics:
582 =item heuristic_expiry => $bool
584 If passed as a FALSE value, don't apply heuristics and just return
585 C<undef> when "Expires" or "Cache-Control" is lacking.
587 =item h_lastmod_fraction => $num
589 This number represent the fraction of the difference since the
590 "Last-Modified" timestamp to make the expiry time. The default is
591 C<0.10>, the suggested typical setting of 10% in RFC 2616.
595 This is the lower limit of the heuristic expiry age to use. The
596 default is C<60> (1 minute).
600 This is the upper limit of the heuristic expiry age to use. The
601 default is C<86400> (24 hours).
603 =item h_default => $sec
605 This is the expiry age to use when nothing else applies. The default
606 is C<3600> (1 hour) or "h_min" if greater.
610 =item $r->is_fresh( %opt )
612 Returns TRUE if the response is fresh, based on the values of
613 freshness_lifetime() and current_age(). If the response is no longer
614 fresh, then it has to be re-fetched or re-validated by the origin
617 Options might be passed to control expiry heuristics, see the
618 description of freshness_lifetime().
620 =item $r->fresh_until( %opt )
622 Returns the time (seconds since epoch) when this entity is no longer fresh.
624 Options might be passed to control expiry heuristics, see the
625 description of freshness_lifetime().
631 L<HTTP::Headers>, L<HTTP::Message>, L<HTTP::Status>, L<HTTP::Request>
635 Copyright 1995-2004 Gisle Aas.
637 This library is free software; you can redistribute it and/or
638 modify it under the same terms as Perl itself.