.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is >0, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{\
. if \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{\
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "POE::Component::Server::SOAP 3pm"
.TH POE::Component::Server::SOAP 3pm "2022-06-17" "perl v5.34.0" "User Contributed Perl Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
POE::Component::Server::SOAP \- publish POE event handlers via SOAP over HTTP
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
.Vb 2
\& use POE;
\& use POE::Component::Server::SOAP;
\&
\& POE::Component::Server::SOAP\->new(
\& \*(AqALIAS\*(Aq => \*(AqMySOAP\*(Aq,
\& \*(AqADDRESS\*(Aq => \*(Aqlocalhost\*(Aq,
\& \*(AqPORT\*(Aq => 32080,
\& \*(AqHOSTNAME\*(Aq => \*(AqMyHost.com\*(Aq,
\& );
\&
\& POE::Session\->create(
\& \*(Aqinline_states\*(Aq => {
\& \*(Aq_start\*(Aq => \e&setup_service,
\& \*(Aq_stop\*(Aq => \e&shutdown_service,
\& \*(AqSum_Things\*(Aq => \e&do_sum,
\& },
\& );
\&
\& $poe_kernel\->run;
\& exit 0;
\&
\& sub setup_service {
\& my $kernel = $_[KERNEL];
\& $kernel\->alias_set( \*(AqMyServer\*(Aq );
\& $kernel\->post( \*(AqMySOAP\*(Aq, \*(AqADDMETHOD\*(Aq, \*(AqMyServer\*(Aq, \*(AqSum_Things\*(Aq );
\& }
\&
\& sub shutdown_service {
\& $_[KERNEL]\->post( \*(AqMySOAP\*(Aq, \*(AqDELMETHOD\*(Aq, \*(AqMyServer\*(Aq, \*(AqSum_Things\*(Aq );
\& }
\&
\& sub do_sum {
\& my $response = $_[ARG0];
\& my $params = $response\->soapbody;
\& my $sum = 0;
\& while (my ($field, $value) = each(%$params)) {
\& $sum += $value;
\& }
\&
\& # Fake an error
\& if ( $sum < 100 ) {
\& $_[KERNEL]\->post( \*(AqMySOAP\*(Aq, \*(AqFAULT\*(Aq, $response, \*(AqClient.Add.Error\*(Aq, \*(AqThe sum must be above 100\*(Aq );
\& } else {
\& # Add the content
\& $response\->content( "Thanks. Sum is: $sum" );
\& $_[KERNEL]\->post( \*(AqMySOAP\*(Aq, \*(AqDONE\*(Aq, $response );
\& }
\& }
.Ve
.SH "ABSTRACT"
.IX Header "ABSTRACT"
.Vb 1
\& An easy to use SOAP/1.1 daemon for POE\-enabled programs
.Ve
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
This module makes serving \s-1SOAP/1.1\s0 requests a breeze in \s-1POE.\s0
.PP
The hardest thing to understand in this module is the \s-1SOAP\s0 Body. That's it!
.PP
The standard way to use this module is to do this:
.PP
.Vb 2
\& use POE;
\& use POE::Component::Server::SOAP;
\&
\& POE::Component::Server::SOAP\->new( ... );
\&
\& POE::Session\->create( ... );
\&
\& POE::Kernel\->run();
.Ve
.PP
POE::Component::Server::SOAP is a bolt-on component that can publish event handlers via \s-1SOAP\s0 over \s-1HTTP.\s0
Currently, this module only supports \s-1SOAP/1.1\s0 requests, work will be done in the future to support \s-1SOAP/1.2\s0 requests.
The \s-1HTTP\s0 server is done via POE::Component::Server::SimpleHTTP.
.SS "Starting Server::SOAP"
.IX Subsection "Starting Server::SOAP"
To start Server::SOAP, just call it's new method:
.PP
.Vb 7
\& POE::Component::Server::SOAP\->new(
\& \*(AqALIAS\*(Aq => \*(AqMySOAP\*(Aq,
\& \*(AqADDRESS\*(Aq => \*(Aq192.168.1.1\*(Aq,
\& \*(AqPORT\*(Aq => 11111,
\& \*(AqHOSTNAME\*(Aq => \*(AqMySite.com\*(Aq,
\& \*(AqHEADERS\*(Aq => {},
\& );
.Ve
.PP
This method will die on error or return success.
.PP
This constructor accepts only 7 options.
.ie n .IP """ALIAS""" 4
.el .IP "\f(CWALIAS\fR" 4
.IX Item "ALIAS"
This will set the alias Server::SOAP uses in the \s-1POE\s0 Kernel.
This will default to \*(L"SOAPServer\*(R"
.ie n .IP """ADDRESS""" 4
.el .IP "\f(CWADDRESS\fR" 4
.IX Item "ADDRESS"
This value will be passed to POE::Component::Server::SimpleHTTP to bind to.
.Sp
Examples:
\s-1ADDRESS\s0 => 0 # Bind to all addresses + localhost
\s-1ADDRESS\s0 => 'localhost' # Bind to localhost
\s-1ADDRESS\s0 => '192.168.1.1' # Bind to specified \s-1IP\s0
.ie n .IP """PORT""" 4
.el .IP "\f(CWPORT\fR" 4
.IX Item "PORT"
This value will be passed to POE::Component::Server::SimpleHTTP to bind to.
.ie n .IP """HOSTNAME""" 4
.el .IP "\f(CWHOSTNAME\fR" 4
.IX Item "HOSTNAME"
This value is for the HTTP::Request's \s-1URI\s0 to point to.
If this is not supplied, POE::Component::Server::SimpleHTTP will use Sys::Hostname to find it.
.ie n .IP """HEADERS""" 4
.el .IP "\f(CWHEADERS\fR" 4
.IX Item "HEADERS"
This should be a hashref, that will become the default headers on all HTTP::Response objects.
You can override this in individual requests by setting it via \f(CW$response\fR\->header( ... )
.Sp
The default header is:
Server => 'POE::Component::Server::SOAP/' . \f(CW$VERSION\fR
.Sp
For more information, consult the HTTP::Headers module.
.ie n .IP """MUSTUNDERSTAND""" 4
.el .IP "\f(CWMUSTUNDERSTAND\fR" 4
.IX Item "MUSTUNDERSTAND"
This is a boolean value, controlling whether Server::SOAP will check for this value in the Headers and Fault if it is present.
This will default to true.
.ie n .IP """SIMPLEHTTP""" 4
.el .IP "\f(CWSIMPLEHTTP\fR" 4
.IX Item "SIMPLEHTTP"
This allows you to pass options to the SimpleHTTP backend. One of the real reasons is to support \s-1SSL\s0 in Server::SOAP, yay!
To learn how to use \s-1SSL,\s0 please consult the POE::Component::Server::SimpleHTTP documentation. Of course, you could totally screw
up things, just use this with caution :)
.Sp
You must pass a hash reference as the value, because it will be expanded and put in the Server::SimpleHTTP\->\fBnew()\fR constructor.
.SS "Events"
.IX Subsection "Events"
There are only a few ways to communicate with Server::SOAP.
.ie n .IP """ADDMETHOD""" 4
.el .IP "\f(CWADDMETHOD\fR" 4
.IX Item "ADDMETHOD"
.Vb 5
\& This event accepts four arguments:
\& \- The intended session alias
\& \- The intended session event
\& \- The public service name ( not required \-> defaults to session alias )
\& \- The public method name ( not required \-> defaults to session event )
\&
\& Calling this event will add the method to the registry.
\&
\& NOTE: This will overwrite the old definition of a method if it exists!
.Ve
.ie n .IP """DELMETHOD""" 4
.el .IP "\f(CWDELMETHOD\fR" 4
.IX Item "DELMETHOD"
.Vb 3
\& This event accepts two arguments:
\& \- The service name
\& \- The method name
\&
\& Calling this event will remove the method from the registry.
\&
\& NOTE: if the service now contains no methods, it will also be removed.
.Ve
.ie n .IP """DELSERVICE""" 4
.el .IP "\f(CWDELSERVICE\fR" 4
.IX Item "DELSERVICE"
.Vb 2
\& This event accepts one argument:
\& \- The service name
\&
\& Calling this event will remove the entire service from the registry.
.Ve
.ie n .IP """DONE""" 4
.el .IP "\f(CWDONE\fR" 4
.IX Item "DONE"
.Vb 1
\& This event accepts only one argument: the SOAP::Response object we sent to the handler.
\&
\& Calling this event implies that this particular request is done, and will proceed to close the socket.
\&
\& The content in $response\->content() will be automatically serialized via SOAP::Lite\*(Aqs SOAP::Serializer
\&
\& NOTE: This method automatically sets some parameters:
\& \- HTTP Status = 200 ( if not defined )
\& \- HTTP Header value of \*(AqContent\-Type\*(Aq = \*(Aqtext/xml\*(Aq
\&
\& To get greater throughput and response time, do not post() to the DONE event, call() it!
\& However, this will force your program to block while servicing SOAP requests...
.Ve
.ie n .IP """RAWDONE""" 4
.el .IP "\f(CWRAWDONE\fR" 4
.IX Item "RAWDONE"
.Vb 1
\& This event accepts only one argument: the SOAP::Response object we sent to the handler.
\&
\& Calling this event implies that this particular request is done, and will proceed to close the socket.
\&
\& The only difference between this and the DONE event is that the content in $response\->content() will not
\& be serialized and passed through intact to the SOAP envelope. This is useful if you generate the xml yourself.
\&
\& NOTE:
\& \- The xml content does not need to have a header
\& \- In SOAP::Lite, the client sees \*(Aq5489\*(Aq as \*(Aq54\*(Aq only!
\& The solution is to enclose the xml in another name, i.e. \*(Aq5489\*(Aq
\& \- If the xml is malformed or is not escaped properly, the client will get terribly confused!
\&
\& It will be inserted here:
\& ...YOURSTUFFHERE...
.Ve
.ie n .IP """FAULT""" 4
.el .IP "\f(CWFAULT\fR" 4
.IX Item "FAULT"
.Vb 6
\& This event accepts five arguments:
\& \- the HTTP::Response object we sent to the handler
\& \- SOAP Fault Code ( not required \-> defaults to \*(AqServer\*(Aq )
\& \- SOAP Fault String ( not required \-> defaults to \*(AqApplication Faulted\*(Aq )
\& \- SOAP Fault Detail ( not required )
\& \- SOAP Fault Actor ( not required )
\&
\& Again, calling this event implies that this particular request is done, and will proceed to close the socket.
\&
\& Calling this event will generate a SOAP Fault and return it to the client.
\&
\& NOTE: This method automatically sets some parameters:
\& \- HTTP Status = 500 ( if not defined )
\& \- HTTP Header value of \*(AqContent\-Type\*(Aq = \*(Aqtext/xml\*(Aq
\& \- HTTP Content = SOAP Envelope of the fault ( overwriting anything that was there )
.Ve
.ie n .IP """RAWFAULT""" 4
.el .IP "\f(CWRAWFAULT\fR" 4
.IX Item "RAWFAULT"
.Vb 1
\& This event accepts only one argument: the SOAP::Response object we sent to the handler.
\&
\& Calling this event implies that this particular request is done, and will proceed to close the socket.
\&
\& The only difference between this and the FAULT event is that you are given freedom to create your own xml for the
\& fault. It will be passed through intact to the SOAP envelope. Be sure to read the SOAP specs :)
\&
\& This is very similar to the RAWDONE event, so go read the notes up there!
\&
\& It will be inserted here:
\& ...YOURSTUFFHERE...
.Ve
.ie n .IP """CLOSE""" 4
.el .IP "\f(CWCLOSE\fR" 4
.IX Item "CLOSE"
.Vb 1
\& This event accepts only one argument: the SOAP::Response object we sent to the handler.
\&
\& Calling this event will proceed to close the socket, not sending any output.
.Ve
.ie n .IP """STARTLISTEN""" 4
.el .IP "\f(CWSTARTLISTEN\fR" 4
.IX Item "STARTLISTEN"
.Vb 1
\& Starts the listening socket, if it was shut down
.Ve
.ie n .IP """STOPLISTEN""" 4
.el .IP "\f(CWSTOPLISTEN\fR" 4
.IX Item "STOPLISTEN"
.Vb 1
\& Simply a wrapper for SHUTDOWN GRACEFUL, but will not shutdown Server::SOAP if there is no more requests
.Ve
.ie n .IP """SHUTDOWN""" 4
.el .IP "\f(CWSHUTDOWN\fR" 4
.IX Item "SHUTDOWN"
.Vb 4
\& Without arguments, Server::SOAP does this:
\& Close the listening socket
\& Kills all pending requests by closing their sockets
\& Removes it\*(Aqs alias
\&
\& With an argument of \*(AqGRACEFUL\*(Aq, Server::SOAP does this:
\& Close the listening socket
\& Waits for all pending requests to come in via DONE/FAULT/CLOSE, then removes it\*(Aqs alias
.Ve
.SS "Processing Requests"
.IX Subsection "Processing Requests"
if you're new to the world of \s-1SOAP,\s0 reading the documentation by the excellent author of SOAP::Lite is recommended!
It also would help to read some stuff at http://www.soapware.org/ \-> they have some excellent links :)
.PP
Now, once you have set up the services/methods, what do you expect from Server::SOAP?
Every request is pretty straightforward, you just get a Server::SOAP::Response object in \s-1ARG0.\s0
.PP
.Vb 4
\& The Server::SOAP::Response object contains a wealth of information about the specified request:
\& \- There is the SimpleHTTP::Connection object, which gives you connection information
\& \- There is the various SOAP accessors provided via Server::SOAP::Response
\& \- There is the HTTP::Request object
\&
\& Example information you can get:
\& $response\->connection\->remote_ip() # IP of the client
\& $response\->soaprequest\->uri() # Original URI
\& $response\->soapmethod() # The SOAP method that was called
\& $response\->soapbody() # The arguments to the method
.Ve
.PP
Probably the most important part of SOAP::Response is the body of the message, which contains the arguments to the method call.
The data in the body is a hash, for more information look at SOAP::Lite \-> SOAP::Deserializer.
.PP
I cannot guarantee what will be in the body, it is all up to the \s-1SOAP\s0 serializer/deserializer. I can provide some examples:
.PP
.Vb 2
\& NOTE: It is much easier to play around with parameters if they are properly encoded.
\& If you are using SOAP::Lite, make extensive use of SOAP::Data\->name() to create parameters :)
\&
\& Calling a SOAP method with no arguments:
\& print SOAP::Lite
\& \-> uri(\*(Aqhttp://localhost:32080/\*(Aq)
\& \-> proxy(\*(Aqhttp://localhost:32080/?session=MyServer\*(Aq)
\& \-> Sum_Things()
\& \-> result
\&
\& The body will look like this:
\& $VAR1 = undef;
\&
\& Calling a SOAP method with multiple arguments:
\& print SOAP::Lite
\& \-> uri(\*(Aqhttp://localhost:32080/\*(Aq)
\& \-> proxy(\*(Aqhttp://localhost:32080/?session=MyServer\*(Aq)
\& \-> Sum_Things( 8, 6, 7, 5, 3, 0, 9, 183 )
\& \-> result
\&
\& The body will look like this:
\& $VAR1 = {
\& \*(Aqc\-gensym17\*(Aq => \*(Aq183\*(Aq,
\& \*(Aqc\-gensym5\*(Aq => \*(Aq6\*(Aq,
\& \*(Aqc\-gensym13\*(Aq => \*(Aq0\*(Aq,
\& \*(Aqc\-gensym11\*(Aq => \*(Aq3\*(Aq,
\& \*(Aqc\-gensym15\*(Aq => \*(Aq9\*(Aq,
\& \*(Aqc\-gensym9\*(Aq => \*(Aq5\*(Aq,
\& \*(Aqc\-gensym3\*(Aq => \*(Aq8\*(Aq,
\& \*(Aqc\-gensym7\*(Aq => \*(Aq7\*(Aq
\& };
\&
\& NOTE: The original array ordering can be received by sorting on the keys.
\&
\& Calling a SOAP method with an arrayref
\& print SOAP::Lite
\& \-> uri(\*(Aqhttp://localhost:32080/\*(Aq)
\& \-> proxy(\*(Aqhttp://localhost:32080/?session=MyServer\*(Aq)
\& \-> Sum_Things(
\& [ 8, 6, 7, 5, 3, 0, 9, 183 ]
\& )
\& \-> result
\&
\& The body will look like this:
\& $VAR1 = {
\& \*(AqArray\*(Aq => [
\& \*(Aq8\*(Aq,
\& \*(Aq6\*(Aq,
\& \*(Aq7\*(Aq,
\& \*(Aq5\*(Aq,
\& \*(Aq3\*(Aq,
\& \*(Aq0\*(Aq,
\& \*(Aq9\*(Aq,
\& \*(Aq183\*(Aq
\& ]
\& };
\&
\& Calling a SOAP method with a hash:
\& print SOAP::Lite
\& \-> uri(\*(Aqhttp://localhost:32080/\*(Aq)
\& \-> proxy(\*(Aqhttp://localhost:32080/?session=MyServer\*(Aq)
\& \-> Sum_Things( {
\& \*(AqFOO\*(Aq => \*(Aqbax\*(Aq,
\& \*(AqHello\*(Aq => \*(AqWorld!\*(Aq,
\& } )
\& \-> result
\&
\& The body will look like this:
\& $VAR1 = {
\& \*(Aqc\-gensym21\*(Aq => {
\& \*(AqHello\*(Aq => \*(AqWorld!\*(Aq,
\& \*(AqFOO\*(Aq => \*(Aqbax\*(Aq,
\& }
\& };
\&
\& Calling a SOAP method using SOAP::Data methods:
\& print SOAP::Lite
\& \-> uri(\*(Aqhttp://localhost:32080/\*(Aq)
\& \-> proxy(\*(Aqhttp://localhost:32080/?session=MyServer\*(Aq)
\& \-> Sum_Things(
\& SOAP::Data\->name( \*(AqFoo\*(Aq, \*(Aqharz\*(Aq ),
\& SOAP::Data\->name( \*(AqParam\*(Aq, \*(Aqvalue\*(Aq ),
\& )\-> result
\&
\& The body will look like this:
\& $VAR1 = {
\& \*(AqParam\*(Aq => \*(Aqvalue\*(Aq,
\& \*(AqFoo\*(Aq => \*(Aqharz\*(Aq
\& };
.Ve
.PP
Simply experiment using Data::Dumper and you'll quickly get the hang of it!
.PP
When you're done with the \s-1SOAP\s0 request, stuff whatever output you have into the content of the response object.
.PP
.Vb 1
\& $response\->content( \*(AqThe result is ... \*(Aq );
.Ve
.PP
The only thing left to do is send it off to the \s-1DONE\s0 event :)
.PP
.Vb 1
\& $_[KERNEL]\->post( \*(AqMySOAP\*(Aq, \*(AqDONE\*(Aq, $response );
.Ve
.PP
If there's an error, you can send it to the \s-1FAULT\s0 event, which will convert it into a \s-1SOAP\s0 fault.
.PP
.Vb 2
\& # See this website for more details about what "SOAP Fault" is :)
\& # http://www.w3.org/TR/2000/NOTE\-SOAP\-20000508/#_Toc478383507
\&
\& $_[KERNEL]\->post( \*(AqMySOAP\*(Aq, \*(AqFAULT\*(Aq, $response, \*(AqClient.Authentication\*(Aq, \*(AqInvalid password\*(Aq );
.Ve
.SS "Server::SOAP Notes"
.IX Subsection "Server::SOAP Notes"
This module is very picky about capitalization!
.PP
All of the options are uppercase, to avoid confusion.
.PP
You can enable debugging mode by doing this:
.PP
.Vb 2
\& sub POE::Component::Server::SOAP::DEBUG () { 1 }
\& use POE::Component::Server::SOAP;
.Ve
.PP
In the case you want to see the raw xml being received/sent to the client, set \s-1DEBUG\s0 to 2.
.PP
Yes, I broke a lot of things in the release ( 1.01 ), but Rocco agreed that it's best to break things
as early as possible, so that development can move on instead of being stuck on legacy issues.
.SS "Using \s-1SSL\s0"
.IX Subsection "Using SSL"
So you want to use \s-1SSL\s0 in Server::SOAP? Here's a example on how to do it:
.PP
.Vb 6
\& POE::Component::Server::SOAP\->new(
\& ...
\& \*(AqSIMPLEHTTP\*(Aq => {
\& \*(AqSSLKEYCERT\*(Aq => [ \*(Aqpublic\-key.pem\*(Aq, \*(Aqpublic\-cert.pem\*(Aq ],
\& },
\& );
\&
\& # And that\*(Aqs it provided you\*(Aqve already created the necessary key + certificate file :)
.Ve
.PP
Ah, to use \s-1SSL\s0 in SOAP::Lite, simply use https://blah.com instead of http://blah.com
.SH "SUPPORT"
.IX Header "SUPPORT"
You can find documentation for this module with the perldoc command.
.PP
.Vb 1
\& perldoc POE::Component::Server::SOAP
.Ve
.SS "Websites"
.IX Subsection "Websites"
.IP "\(bu" 4
AnnoCPAN: Annotated \s-1CPAN\s0 documentation
.Sp
.IP "\(bu" 4
\&\s-1CPAN\s0 Ratings
.Sp
.IP "\(bu" 4
\&\s-1RT: CPAN\s0's request tracker
.Sp
.IP "\(bu" 4
Search \s-1CPAN\s0
.Sp
.SS "Bugs"
.IX Subsection "Bugs"
Please report any bugs or feature requests to \f(CW\*(C`bug\-poe\-component\-server\-soap at rt.cpan.org\*(C'\fR, or through
the web interface at . I will be
notified, and then you'll automatically be notified of progress on your bug as I make changes.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
The examples directory that came with this component.
.PP
\&\s-1POE\s0
.PP
HTTP::Response
.PP
HTTP::Request
.PP
POE::Component::Server::SOAP::Response
.PP
POE::Component::Server::SimpleHTTP
.PP
SOAP::Lite
.PP
POE::Component::SSLify
.SH "AUTHOR"
.IX Header "AUTHOR"
Apocalypse
.PP
I took over this module from Rocco Caputo. Here is his stuff:
.PP
.Vb 4
\& POE::Component::Server::SOAP is Copyright 2002 by Rocco Caputo. All
\& rights are reserved. POE::Component::Server::SOAP is free software;
\& you may redistribute it and/or modify it under the same terms as Perl
\& itself.
\&
\& Rocco may be contacted by e\-mail via rcaputo@cpan.org.
.Ve
.SH "COPYRIGHT AND LICENSE"
.IX Header "COPYRIGHT AND LICENSE"
Copyright 2009 by Apocalypse
.PP
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.