Another question.

2011/5/27 Ernesto Revilla Derksen <[email protected]>

> Hi again.
>
> Now I am extracting de security data as follows (really easy!):
> ...
> ns_wsse = "
> http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd
> "
>
> class UsernameTokenType(ClassModel):
>     __namespace__ = ns_wsse
>     Username = String
>     Password = String
>     Nonce = String
>
I would like to add a datetime variable from another namespace (wsu). How
would I do that?

Erny


>
>
> class Security(ClassModel):
>     __namespace__ = ns_wsse
>     UsernameToken = UsernameTokenType
>
>
> class HelloWorldService(DefinitionBase):
>     __in_header__ = Security
>
>     def on_method_call(self, method_name, py_params, soap_params):
>         # I can't access self.in_header here!
>         pass
>
>     @soap(String, Integer, _returns=Array(String))
>     def say_hello(self, name, times):
>         # We have access to self.in_header here.
>         results = []
>         for i in range(0, times):
>             results.append('Hello, %s' % name)
>         return results
>
> To implement a service wide authentication procedure, I would have to
> implement it as decorator, as the method "on_method_call" has no access to
> "in_header".
>
> Any other suggestions?
>
> Regards.
> Erny
>
> 2011/5/27 Chris Austin <[email protected]>
>
>> On Thu, May 26, 2011 at 5:16 PM, Ernesto Revilla Derksen
>> <[email protected]> wrote:
>> > Hi.
>> > First of all, you're doing a great work with soaplib!!!
>> > I was just running the debugger to see how soaplibs treats the headers.
>> > In soaplib/core/_base.py:decompose_incoming_envelope (near line 335), we
>> get
>> > the header & body parsed. Fine!
>> > But just below, there is no self.validateHeader or self.checkHeader. So
>> the
>> > body is validated before (!) any headers can be validades. Could there
>> be a
>> > hook?
>> > In method deserialize_soap (lines 406-417):
>> >             # decode header object
>> >             if (ctx.in_header_xml is not None and
>> >                 len(ctx.in_header_xml) > 0 and
>> >                 header_class is not None):
>> >                 ctx.service.in_header =
>> > header_class.from_xml(ctx.in_header_xml)
>> >
>> > how do IN-wrappers supposed to work? could you give an example?
>>
>> Sure, this is taken from the test at
>>
>> https://github.com/soaplib/soaplib/blob/master/src/soaplib/core/test/interop/server/_service.py
>>
>> You can define your headers as follows.
>>
>> class InHeader(ClassModel):
>>    s=String
>>    i=Integer
>>
>> class OutHeader(ClassModel):
>>    dt=DateTime
>>    f=Float
>>
>> Now, you can write a service  that references your headers and, you
>> can get access to the headers in your web methods as echo_in_header()
>> and send_out_header() do below.
>>
>> class InteropServiceWithHeader(service.DefinitionBase):
>>    __in_header__ = InHeader
>>    __out_header__ = OutHeader
>>
>>    @soap(_returns=InHeader)
>>    def echo_in_header(self):
>>        return self.in_header
>>
>>    @soap(_returns=OutHeader)
>>    def send_out_header(self):
>>        self.out_header = OutHeader()
>>        self.out_header.dt = datetime(year=2000, month=01, day=01)
>>        self.out_header.f = 3.141592653
>>
>>        return self.out_header
>>
>>
>> Now, you can work with the headers in you client following something
>> similar to the following example which is also take from an interop
>> test found at :
>> https://github.com/soaplib/soaplib/blob/master/src/soaplib/core/test/interop/test_suds.py
>>
>> So, you can treat headers just like any other datatype exposed by the
>> service.
>>
>> def test_echo_in_header(self):
>>        in_header = self.client.factory.create('InHeader')
>>        in_header.s = 'a'
>>        in_header.i = 3
>>
>>        self.client.set_options(soapheaders=in_header)
>>        ret = self.client.service.echo_in_header()
>>        self.client.set_options(soapheaders=None)
>>
>>        print ret
>>
>>        self.assertEquals(in_header.s, ret.s)
>>        self.assertEquals(in_header.i, ret.i)
>>
>>    def test_send_out_header(self):
>>        out_header = self.client.factory.create('OutHeader')
>>        out_header.dt = datetime(year=2000, month=01, day=01)
>>        out_header.f = 3.141592653
>>
>>        ret = self.client.service.send_out_header()
>>
>>        self.assertTrue(isinstance(ret,type(out_header)))
>>        self.assertEquals(ret.dt, out_header.dt)
>>        self.assertEquals(ret.f, out_header.f)
>>
>>
>> I hope this helps.
>>
>> > In process_request (line 436):
>> > ctx.service.on_method_call(ctx.method_name,req_obj,ctx.in_body_xml)
>> > the header is NOT sent to the service hook
>> > As I can see (and sure that I'm wrong), I have the following
>> alternatives of
>> > processing SOAP headers:
>> >  - using IN-wrappers:
>> >  - override Application object customizing one of:
>> >    - deserialize_soap (says: not meant to be override!)
>> >    - decompose_incoming_envelope
>> >    - process_request (says: not meant to be override!)
>> > Where would be the best place to implement header checking? (e.g.
>> security=
>> > Thanks in advance.
>> > Best regards.
>> > Erny
>> > Spain
>> > Ernesto Revilla
>> > Yaco Sistemas
>> > +34 954 500 057
>> >
>> > _______________________________________________
>> > Soap mailing list
>> > [email protected]
>> > http://mail.python.org/mailman/listinfo/soap
>> >
>> >
>>
>
>
_______________________________________________
Soap mailing list
[email protected]
http://mail.python.org/mailman/listinfo/soap

Reply via email to