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

  1. package SOAP::Transport::HTTP::Apache;
  2.  
  3. use strict;
  4. use vars qw($VERSION);
  5. $VERSION = '0.23';
  6.  
  7. use SOAP::Transport::HTTP::Server;
  8.  
  9. use Apache;
  10. use Apache::Constants qw(:common :response);
  11.  
  12. sub handler {
  13.     my (undef, $safe_classes, $optional_dispatcher) = @_;
  14.  
  15.     my $r = Apache->request();
  16.  
  17.     my %args = $r->args();
  18.     unless (exists $args{class}) {
  19.         return BAD_REQUEST;
  20.     }
  21.     my $request_class = $args{class};
  22.     unless (exists $safe_classes->{$request_class}) {
  23.         return BAD_REQUEST;
  24.     }
  25.     my $http_protocol = $r->protocol();
  26.     my $http_method   = $r->method();
  27.  
  28.     my $request_header_reader = sub {
  29.         $r->header_in($_[0]);
  30.     };
  31.     my $request_content_reader = sub {
  32.         $r->read(@_);
  33.     };
  34.  
  35.     my $response_header_writer = sub {
  36.         $r->header_out(@_);
  37.     };
  38.  
  39.     my $sent_headers = 0;
  40.     my $response_content_writer = sub {
  41.         $r->send_http_header() unless $sent_headers++;
  42.         $r->print(shift);
  43.     };
  44.  
  45.     my $s = SOAP::Transport::HTTP::Server->new();
  46.  
  47.     $s->handle_request($http_method, $request_class,
  48.                        $request_header_reader, 
  49.                        $request_content_reader,
  50.                        $response_header_writer,
  51.                        $response_content_writer,
  52.                        $optional_dispatcher);
  53.  
  54.     return OK;
  55. }
  56.  
  57. 1;
  58. __END__
  59.  
  60. =head1 NAME
  61.  
  62. SOAP::Transport::HTTP::Apache - SOAP mod_perl handler
  63.  
  64. =head1 SYNOPSIS
  65.  
  66. Use this class to expose SOAP endpoints using Apache and mod_perl.
  67. Here's an example of a class that would like to receive SOAP
  68. packets. Note that it implements a single interesting function,
  69. handle_request, that takes there arguments: an array of headers,
  70. a body, and an EnvelopeMaker for creating the response:
  71.  
  72.     package Calculator;
  73.     use strict;
  74.  
  75.     sub new {
  76.         bless {}, shift;
  77.     }
  78.  
  79.     sub handle_request {
  80.         my ($self, $headers, $body, $envelopeMaker) = @_;
  81.  
  82.         $body->{extra_stuff} = "heres some extra stuff";
  83.  
  84.         foreach my $header (@$headers) {
  85.             $header->{extra_stuff} = "heres some more extra stuff";
  86.         $envelopeMaker->add_header(undef, undef, 0, 0, $header);
  87.     }
  88.     $envelopeMaker->set_body(undef, 'myresponse', 0, $body);
  89.     }
  90.  
  91.     1;
  92.  
  93. In order to translate HTTP requests into calls on your Calculator
  94. class above, you'll need to write an Apache handler. This is where
  95. you'll use the SOAP::Transport::HTTP::Apache class:
  96.  
  97.     package ServerDemo;
  98.     use strict;
  99.     use SOAP::Transport::HTTP::Apache;
  100.  
  101.     sub handler {
  102.     my $safe_classes = {
  103.         Calculator => undef,
  104.     };
  105.       SOAP::Transport::HTTP::Apache->handler($safe_classes);
  106.     }
  107.  
  108. 1;
  109.  
  110. As you can see, this class basically does it all - parses the HTTP
  111. headers, reads the request, and sends a response. All you have to do
  112. is specify the names of classes that are safe to dispatch to.
  113.  
  114. Of course, in order to tell Apache about your handler class above,
  115. you'll need to modify httpd.conf. Here's a simple example that shows
  116. how to set up an endpoint called "/soap" that maps to your ServerDemo
  117. handler above:
  118.  
  119.     <Location /soap>
  120.         SetHandler perl-script
  121.         PerlHandler ServerDemo
  122.     </Location>
  123.  
  124. (I leave it up to you to make sure ServerDemo is in
  125. Perl's @INC path - see Writing Apache Modules
  126. with Perl and C by O'Reilly for help with mod_perl,
  127. or just man mod_perl)
  128.  
  129. =head1 DESCRIPTION
  130.  
  131. This class encapsulates the details of hooking up to mod_perl,
  132. and then calls SOAP::Transport::HTTP::Server to do the SOAP-specific
  133. stuff. This way the Server class can be reused with any web server
  134. configuration (including CGI), by simply composing it with a different
  135. front-end (for instance, SOAP::Transport::HTTP::CGI).
  136.  
  137. =head2 handler(SafeClassHash, OptionalDispatcher)
  138.  
  139. This is the only method on the class, and you must pass a
  140. hash reference whose keys contain the collection of classes
  141. that may be invoked at this endpoint. If you specify class
  142. FooBar in this list, for instance, and a client sends a SOAP
  143. request to http://yourserver/soap?class=FooBar, then the
  144. SOAP::Transport::HTTP::Server class will eventually attempt
  145. to load FooBar.pm, instatiate a FooBar, and call
  146. its handle_request function (see SOAP::Transport::HTTP::Server
  147. for more detail). If you don't include a class in this hash,
  148. SOAP/Perl won't run it. I promise.
  149.  
  150. By the way, only the keys in this hash are important, the
  151. values are ignored. 
  152.  
  153. Also, nothing is stopping you from messing around with the request
  154. object yourself if you'd like to add some headers or whatever;
  155. you can always call Apache->request() to get the request object
  156. inside your handle_request function. Just make sure you finish
  157. what you're doing before you return to SOAP::Transport::HTTP::Server,
  158. because at that point the response is marshaled and sent back.
  159.  
  160. See SOAP::Transport::HTTP::Server for a description of the
  161. OptionalDispatcher argument.
  162.  
  163. =head1 DEPENDENCIES
  164.  
  165. SOAP::Transport::HTTP::Server
  166.  
  167. =head1 AUTHOR
  168.  
  169. Keith Brown
  170.  
  171. =cut
  172.