.\" 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.