NAME
XML::Compile::SOAP::Daemon::AnyDaemon - SOAP server based on Any::Daemon
INHERITANCE
XML::Compile::SOAP::Daemon::AnyDaemon
is a XML::Compile::SOAP::Daemon
XML::Compile::SOAP::Daemon::AnyDaemon
is a Any::Daemon
SYNOPSIS
#### have a look in the examples directory!
use XML::Compile::SOAP::Daemon::AnyDaemon;
use XML::Compile::SOAP11;
use XML::Compile::SOAP::WSA; # optional
my $daemon = XML::Compile::SOAP::Daemon::AnyDaemon->new;
# daemon definitions from WSDL
my $wsdl = XML::Compile::WSDL11->new(...);
$wsdl->importDefinitions(...); # more schemas
$daemon->operationsFromWSDL($wsdl, callbacks => ...);
# daemon definitions added manually (when no WSDL)
my $soap11 = XML::Compile::SOAP11::Server->new(schemas => $wsdl->schemas);
my $handler = $soap11->compileHandler(...);
$daemon->addHandler('getInfo', $soap11, $handler);
# see what is defined:
$daemon->printIndex;
# finally, run the server. This never returns.
$daemon->run(@daemon_options);
DESCRIPTION
This module handles the exchange of SOAP messages over HTTP with Any::Daemon as daemon implementation. It is a simple pre-forked daemon, much easier than the Net::Server implementations.
We use HTTP::Daemon as HTTP-connection implementation. The HTTP::Request and HTTP::Response objects (provided by HTTP-Message
) are handled via functions provided by XML::Compile::SOAP::Daemon::LWPutil.
This abstraction level of the object (code in this pm file) is not concerned with parsing or composing XML, but only worries about the HTTP transport specifics of SOAP messages. The processing of the SOAP message is handled by the XML::Compile::SOAP::Daemon base-class.
The server is as flexible as possible: accept M-POST (HTTP Extension Framework) and POST (standard HTTP) for any message. It can be used for any SOAP1.1 and SOAP1.2 mixture. Although SOAP1.2 itself is not implemented yet.
See documentation in the base class.
METHODS
See documentation in the base class.
Constructors
See documentation in the base class.
- XML::Compile::SOAP::Daemon::AnyDaemon->new(OPTIONS)
-
Create the server handler, which extends some class which implements a Net::Server daemon.
As OPTIONS, you can pass everything accepted by Any::Daemon subroutine new, like
pid_file
,user
,group
, andworkdir
,-Option --Defined in --Default accept_slow_select XML::Compile::SOAP::Daemon <true> output_charset XML::Compile::SOAP::Daemon 'UTF-8' soap_action_input XML::Compile::SOAP::Daemon {} wsa_action_input XML::Compile::SOAP::Daemon {} wsa_action_output XML::Compile::SOAP::Daemon {}
Attributes
See documentation in the base class.
- $obj->addSoapAction(HASH|PAIRS)
- $obj->addWsaTable(('INPUT'|'OUTPUT'), [HASH|PAIRS])
- $obj->outputCharset()
Running the server
See documentation in the base class.
- $obj->process(CLIENT, XMLIN, REQUEST, ACTION)
- $obj->run(OPTIONS)
-
-Option --Default background <true> child_init undef client_maxreq 100 client_reqbonus 0 client_timeout 30 host undef listen SOMAXCONN max_childs 10 port undef postprocess undef server_name undef socket undef
- background => BOOLEAN
- child_init => CODE
-
This CODE reference will get called by each child which gets started, before the "accept" waiting starts. Ideal moment to start your database-connection.
- client_maxreq => NUMBER
-
Maximum number of requests per connection.
- client_reqbonus => SECONDS
-
Time to add to the timeout as bonus per handled client request. Fast clients get more time over slow clients, more time to reach their maximum number of requests.
- client_timeout => SECONDS
-
The maximum time a connection may exist, before being terminated.
- host => STRING
-
Ignored when a socket is provided, otherwise required.
- listen => INTEGER
-
Ignored when a socket is provided.
- max_childs => INTEGER
- port => INTEGER
-
Ignored when a socket is provided, otherwise required.
- postprocess => CODE
-
See the section about this option in the DETAILS chapter of the XML::Compile::SOAP::Daemon::LWPutil manual-page.
- server_name => STRING
- socket => SOCKET
-
Pass your own socket, in stead of having one created for you. The SOCKET must be an
IO::Socket::INET
(or compatible like IO::Socket::SSL and IO::Socket::IP)
Preparations
See documentation in the base class.
- $obj->addHandler(NAME, SOAP, CODE)
- $obj->operationsFromWSDL(WSDL, OPTIONS)
- $obj->setWsdlResponse(FILENAME, [FILETYPE])
Helpers
See documentation in the base class.
- $obj->faultInvalidXML(ERROR)
- $obj->faultNotSoapMessage(NODETYPE)
- $obj->faultUnsupportedSoapVersion(ENV_NS)
- $obj->handlers(('SOAP11'|'SOAP12'|SOAP))
- $obj->printIndex([FILEHANDLE])
- $obj->soapVersions()
DETAILS
See documentation in the base class.
Operation handlers
See documentation in the base class.
Returning errors
See documentation in the base class.
AnyDaemon with SSL
First, create certificates and let them be signed by a CA (or yourself) See http://devsec.org/info/ssl-cert.html to understand this.
# generate secret private key
openssl genrsa -out privkey.pem 1024
# create a "certification request" (CSR)
openssl req -new -key privkey.pem -out certreq.csr
# send the CSR to the Certification Authority or self-sign:
openssl x509 -req -days 3650 -in certreq.csr -signkey privkey.pem -out newcert.pem
# publish server certificate
( openssl x509 -in newcert.pem; cat privkey.pem ) > server.pem
ln -s server.pem `openssl x509 -hash -noout -in server.pem`.0 # dot-zero
Assuming that the certificates are in 'certs/', the program looks like this:
use Log::Report;
use XML::Compile::SOAP::Daemon::AnyDaemon;
use XML::Compile::WSDL11;
use IO::Socket::SSL 'SSL_VERIFY_NONE';
use IO::Socket 'SOMAXCONN';
my $daemon = XML::Compile::SOAP::Daemon::AnyDaemon->new;
my $wsdl = XML::Compile::WSDL11->new($wsdl);
my %handlers = ();
$daemon->operationsFromWSDL($wsdl, callbacks => \%handlers);
my $socket = IO::Socket::SSL->new
( LocalHost => 'localhost'
, LocalPort => 4444
, Listen => SOMAXCONN
, Reuse => 1
, SSL_server => 1
, SSL_verify_mode => SSL_VERIFY_NONE
, SSL_key_file => 'certs/privkey.pem'
, SSL_cert_file => 'certs/server.pem'
) or error __x"cannot create socket at {interface}: {err}"
, interface => "$host:$port"
, err => IO::Socket::SSL::errstr();
$daemon->run
( name => basename($0)
, max_childs => 1
, socket => $socket
, child_init => \&for_instance_connect_to_db
)
SEE ALSO
This module is part of XML-Compile-SOAP-Daemon distribution version 3.07, built on January 06, 2014. Website: http://perl.overmeer.net/xml-compile/
Other distributions in this suite: XML::Compile, XML::Compile::SOAP, XML::Compile::WSDL11, XML::Compile::SOAP12, XML::Compile::SOAP::Daemon, XML::Compile::SOAP::WSA, XML::Compile::C14N, XML::Compile::WSS, XML::Compile::WSS::Signature, XML::Compile::Tester, XML::Compile::Cache, XML::Compile::Dumper, XML::Compile::RPC, XML::Rewrite and XML::LibXML::Simple.
Please post questions or ideas to the mailinglist at http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/xml-compile . For live contact with other developers, visit the #xml-compile
channel on irc.perl.org
.
LICENSE
Copyrights 2007-2014 by [Mark Overmeer]. For other contributors see ChangeLog.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://www.perl.com/perl/misc/Artistic.html