home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _79a5945385bf5faa1ec9c3cfd1029d8b < prev    next >
Text File  |  2000-03-15  |  5KB  |  212 lines

  1. #
  2. # $Id: Message.pm,v 1.23 1998/11/19 21:45:00 aas Exp $
  3.  
  4. package HTTP::Message;
  5.  
  6. =head1 NAME
  7.  
  8. HTTP::Message - Class encapsulating HTTP messages
  9.  
  10. =head1 SYNOPSIS
  11.  
  12.  package HTTP::Request;  # or HTTP::Response
  13.  require HTTP::Message;
  14.  @ISA=qw(HTTP::Message);
  15.  
  16. =head1 DESCRIPTION
  17.  
  18. A C<HTTP::Message> object contains some headers and a content (body).
  19. The class is abstract, i.e. it only used as a base class for
  20. C<HTTP::Request> and C<HTTP::Response> and should never instantiated
  21. as itself.
  22.  
  23. The following methods are available:
  24.  
  25. =over 4
  26.  
  27. =cut
  28.  
  29. #####################################################################
  30.  
  31. require HTTP::Headers;
  32. require Carp;
  33. use strict;
  34. use vars qw($VERSION $AUTOLOAD);
  35. $VERSION = sprintf("%d.%02d", q$Revision: 1.23 $ =~ /(\d+)\.(\d+)/);
  36.  
  37. $HTTP::URI_CLASS ||= "URI::URL";
  38. eval "require $HTTP::URI_CLASS"; die $@ if $@;
  39.  
  40. =item $mess = new HTTP::Message;
  41.  
  42. This is the object constructor.  It should only be called internally
  43. by this library.  External code should construct C<HTTP::Request> or
  44. C<HTTP::Response> objects.
  45.  
  46. =cut
  47.  
  48. sub new
  49. {
  50.     my($class, $header, $content) = @_;
  51.     if (defined $header) {
  52.     Carp::croak("Bad header argument") unless ref $header;
  53.     $header = $header->clone;
  54.     } else {
  55.     $header = HTTP::Headers->new;
  56.     }
  57.     $content = '' unless defined $content;
  58.     bless {
  59.     '_headers' => $header,
  60.     '_content' => $content,
  61.     }, $class;
  62. }
  63.  
  64.  
  65. =item $mess->clone()
  66.  
  67. Returns a copy of the object.
  68.  
  69. =cut
  70.  
  71. sub clone
  72. {
  73.     my $self  = shift;
  74.     my $clone = HTTP::Message->new($self->{'_headers'}, $self->{'_content'});
  75.     $clone;
  76. }
  77.  
  78. =item $mess->protocol([$proto])
  79.  
  80. Sets the HTTP protocol used for the message.  The protocol() is a string
  81. like "HTTP/1.0" or "HTTP/1.1".
  82.  
  83. =cut
  84.  
  85. sub protocol { shift->_elem('_protocol',  @_); }
  86.  
  87. =item $mess->content([$content])
  88.  
  89. The content() method sets the content if an argument is given.  If no
  90. argument is given the content is not touched.  In either case the
  91. previous content is returned.
  92.  
  93. =item $mess->add_content($data)
  94.  
  95. The add_content() methods appends more data to the end of the previous
  96. content.
  97.  
  98. =cut
  99.  
  100. sub content   { shift->_elem('_content',  @_); }
  101.  
  102. sub add_content
  103. {
  104.     my $self = shift;
  105.     if (ref($_[0])) {
  106.     $self->{'_content'} .= ${$_[0]};  # for backwards compatability
  107.     } else {
  108.     $self->{'_content'} .= $_[0];
  109.     }
  110. }
  111.  
  112. =item $mess->content_ref
  113.  
  114. The content_ref() method will return a reference to content string.
  115. It can be more efficient to access the content this way if the content
  116. is huge, and it can be used for direct manipulation of the content,
  117. for instance:
  118.  
  119.   ${$res->content_ref} =~ s/\bfoo\b/bar/g;
  120.  
  121. =cut
  122.  
  123. sub content_ref
  124. {
  125.     my $self = shift;
  126.     \$self->{'_content'};
  127. }
  128.  
  129. sub as_string
  130. {
  131.     "";  # To be overridden in subclasses
  132. }
  133.  
  134. =item $mess->headers;
  135.  
  136. Return the embedded HTTP::Headers object.
  137.  
  138. =item $mess->headers_as_string([$endl])
  139.  
  140. Call the HTTP::Headers->as_string() method for the headers in the
  141. message.
  142.  
  143. =cut
  144.  
  145. sub headers            { shift->{'_headers'};                }
  146. sub headers_as_string  { shift->{'_headers'}->as_string(@_); }
  147.  
  148. =back
  149.  
  150. All unknown C<HTTP::Message> methods are delegated to the
  151. C<HTTP::Headers> object that is part of every message.  This allows
  152. convenient access to these methods.  Refer to L<HTTP::Headers> for
  153. details of these methods:
  154.  
  155.   $mess->header($field => $val);
  156.   $mess->scan(\&doit);
  157.   $mess->push_header($field => $val);
  158.   $mess->remove_header($field);
  159.  
  160.   $mess->date;
  161.   $mess->expires;
  162.   $mess->if_modified_since;
  163.   $mess->if_unmodified_since;
  164.   $mess->last_modified;
  165.   $mess->content_type;
  166.   $mess->content_encoding;
  167.   $mess->content_length;
  168.   $mess->content_language
  169.   $mess->title;
  170.   $mess->user_agent;
  171.   $mess->server;
  172.   $mess->from;
  173.   $mess->referer;
  174.   $mess->www_authenticate;
  175.   $mess->authorization;
  176.   $mess->proxy_authorization;
  177.   $mess->authorization_basic;
  178.   $mess->proxy_authorization_basic;
  179.  
  180. =cut
  181.  
  182.  
  183. # delegate all other method calls the the _headers object.
  184. sub AUTOLOAD
  185. {
  186.     my $self = shift;
  187.     my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
  188.     return if $method eq "DESTROY";
  189.     $self->{'_headers'}->$method(@_);
  190. }
  191.  
  192. # Private method to access members in %$self
  193. sub _elem
  194. {
  195.     my $self = shift;
  196.     my $elem = shift;
  197.     my $old = $self->{$elem};
  198.     $self->{$elem} = $_[0] if @_;
  199.     return $old;
  200. }
  201.  
  202. 1;
  203.  
  204. =head1 COPYRIGHT
  205.  
  206. Copyright 1995-1997 Gisle Aas.
  207.  
  208. This library is free software; you can redistribute it and/or
  209. modify it under the same terms as Perl itself.
  210.  
  211. =cut
  212.