
BACKGROUND
==========

This is a simple example of the new additions I've been adding to
ZSI. Among these modifications are:

1) Extended code generation facilities for server and client
2) Authorization callbacks
3) ServiceContainer enhancements for implementations to use


Extended Code Generation for Server and Client
----------------------------------------------

These extensions are illustrated by the Echo.wsdl, EchoServer.py and
EchoClient.py that implement an Echo service. The EchoServer.py file
has two classes defined that implement the Echo functionality, the
difference in the two is that one inherits from the generated
EchoServer_interface class (generated by wsdl2dispatch), and one can
be passed to the EchoServer_interface constructor with the keyword
argument impl=<obj>.

These two solutions follow the classic TIE and Derive patterns from
previous systems like CORBA.

The EchoClient.py implements a simple client for each service and
invokes the method to do the work. The second call is programmed to
result in an authorization error.

Authorization Callbacks
-----------------------

This functionality lets you define a method on your implementation
object that can be invoked to authorize calls to it from the
underlying SOAP interface. 

ServiceContainer Enhancements
-----------------------------

I've added the ability to get a CallContext via a ServiceContainer
module level function GetSOAPContext(). This returns a context object
for the current request. I've make this thread-safe by keeping a
global dictionary of contexts indexed by thread id. The requesthandler
object cleanly creates and destroys these for each incoming request.

The SOAPContext contains:

- a reference to the connection object
- a reference to the Service Container
- the HTTP headers
- the raw xml of the request
- the Parsed SOAP object
- the SOAP Action

This should provide all the information a developer could need.

BUILDING
========

You should (with a fresh checkout from cvs that's been installed) be able to run:

>wsdl2py -e -f Echo.wsdl --simple-naming
>wsdl2dispatch -e -f Echo.wsdl --simple-naming

Then in separate terminal windows:

Terminal 1:
>python EchoServer.py

Terminal 2:
>python EchoClient.py

Expected SERVER Output:

C:\xfer\Echo-extended>EchoServer.py
Authorizing TIE Echo
['__doc__', '__init__', '__module__', 'connection', 'container', 'httpheaders',
'parsedsoap', 'soapaction', 'xmldata']
Container:  <socket._socketobject object at 0x00C03030>
Parsed SOAP:  <ZSI.parse.ParsedSoap instance at 0x00C00878>
Container:  <ZSI.ServiceContainer.ServiceContainer instance at 0x00BEB710>
HTTP Headers:
Host: localhost:9999
Accept-Encoding: identity
Content-length: 551
Content-type: text/xml; charset=utf-8
SOAPAction: "Echo"

----
XML Data:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:ZSI="http://www.zolera.com/schemas/ZSI/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >
<SOAP-ENV:Body>
<None  xmlns="">
<in_str id="8fbb88" xsi:type="xsd:string">Test TIE String</in_str>
</None >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

localhost - - [02/Feb/2005 21:35:00] "POST /EchoServer HTTP/1.1" 200 -
NOT Authorizing INHERIT Echo
['__doc__', '__init__', '__module__', 'connection', 'container', 'httpheaders',
'parsedsoap', 'soapaction', 'xmldata']
Container:  <socket._socketobject object at 0x00C03030>
Parsed SOAP:  <ZSI.parse.ParsedSoap instance at 0x00C5EEB8>
Container:  <ZSI.ServiceContainer.ServiceContainer instance at 0x00BEB710>
HTTP Headers:
Host: localhost:9999
Accept-Encoding: identity
Content-length: 555
Content-type: text/xml; charset=utf-8
SOAPAction: "Echo"

----
XML Data:
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope
  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:ZSI="http://www.zolera.com/schemas/ZSI/"
  SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >
<SOAP-ENV:Body>
<None  xmlns="">
<in_str id="8f4cb0" xsi:type="xsd:string">Test INHERIT String</in_str>
</None >
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

localhost - - [02/Feb/2005 21:35:00] "POST /EchoServIn HTTP/1.1" 401 -

Expected CLIENT Output:

C:\xfer\Echo-extended>EchoClient.py
Test TIE StringTest TIE StringTest TIE String
Failed to echo (Inherited):  Not authorized
