Changeset 5526


Ignore:
Timestamp:
27/07/09 17:14:19 (10 years ago)
Author:
pjkersha
Message:

More work on Urllib2SOAPClient class + unit test

Location:
TI12-security/trunk/python
Files:
2 edited
1 copied

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/soap/client.py

    r5521 r5526  
    1616    """Handle client request to a SOAP Service""" 
    1717    def __init__(self): 
    18         self.__soapClass = None 
     18        self.__responseEnvelopeClass = None 
    1919 
    20     def _getSoapClass(self): 
    21         return self.__soapClass 
     20    def _getResponseEnvelopeClass(self): 
     21        return self.__responseEnvelopeClass 
    2222 
    23     def _setSoapClass(self, value): 
    24         if not isinstance(value, SOAPEnvelopeBase): 
     23    def _setResponseEnvelopeClass(self, value): 
     24        if not issubclass(value, SOAPEnvelopeBase): 
    2525            raise TypeError("Setting SOAP class: expecting %r, got %r" % 
    26                             (SOAPEnvelopeBase, value.__class__)) 
    27         self.__soapClass = value 
     26                            (SOAPEnvelopeBase, type(value))) 
     27        self.__responseEnvelopeClass = value 
    2828 
    29     soapClass = property(fget=_getSoapClass,  
    30                          fset=_setSoapClass,  
    31                          doc="Set the SOAP class for handling requests and " 
    32                              " responses") 
     29    responseEnvelopeClass = property(fget=_getResponseEnvelopeClass,  
     30                                     fset=_setResponseEnvelopeClass,  
     31                                     doc="Set the SOAP class for handling " 
     32                                         "requests and responses") 
    3333      
    34     def makeRequest(self, url, soapRequest): 
     34    def makeRequest(self, soapRequest): 
    3535        raise NotImplementedError() 
    3636 
    3737 
     38class _SoapIOBase(object): 
     39    def __init__(self): 
     40        self.__envelope = None 
     41 
     42    def _getEnvelope(self): 
     43        return self.__envelope 
     44 
     45    def _setEnvelope(self, value): 
     46        if not isinstance(value, SOAPEnvelopeBase): 
     47            raise TypeError('Setting SOAP envelope object: expecting %r; got ' 
     48                            '%r' % (SOAPEnvelopeBase, type(value))) 
     49                             
     50        self.__envelope = value 
     51 
     52    envelope = property(fget=_getEnvelope,  
     53                        fset=_setEnvelope,  
     54                        doc="SOAP Envelope object used in request/response") 
     55 
     56         
     57class SOAPRequestBase(object): 
     58    """Interface for SOAP requests""" 
     59    def __init__(self): 
     60        self.__url = None 
     61        self.__envelope = None 
     62 
     63    url = property(fget=_getUrl, fset=_setUrl, doc="URL of SOAP endpoint") 
     64 
     65    def _getUrl(self): 
     66        return self.__url 
     67 
     68    def _setUrl(self, value): 
     69        if not isinstance(value, basestring): 
     70            raise TypeError('Setting request URL: expecting %r; got ' 
     71                            '%r' % (basestring, type(value))) 
     72        self.__url = value 
     73 
     74    
     75class SOAPResponseBase(_SoapIOBase): 
     76    """Interface for SOAP responses""" 
     77 
     78 
    3879import urllib2 
    39 from cStringIO import StringIO 
    4080 
     81class UrlLib2SOAPRequest(SOAPRequestBase):   
     82    """Interface for UrlLib2 based SOAP Requests""" 
     83     
     84     
     85class UrlLib2SOAPResponse(SOAPResponseBase): 
     86    """Interface for UrlLib2 based SOAP Responses""" 
     87    def __init__(self): 
     88        self.__fileobject 
     89 
     90    fileobject = property(fget=_getFileobject, 
     91                          doc="urllib2 file object returned from request") 
     92 
     93    def getFileobject(self): 
     94        return self.__fileobject 
     95 
     96     
    4197class UrlLib2SOAPClient(SOAPClientBase): 
    4298    """urllib2 based SOAP Client""" 
    4399     
    44     def __init__(self, soapClass=None): 
     100    def __init__(self): 
     101        super(UrlLib2SOAPClient, self).__init__() 
    45102        self.__openerDirector = urllib2.OpenerDirector() 
    46103        self.__timeout = None 
    47          
    48         if soapClass is not None: 
    49             self.soapClass = soapClass 
    50104 
    51105    def _getTimeout(self): 
     
    78132                                  "opener(s) for handling requests") 
    79133     
    80     def makeRequest(self, url, soapRequest): 
     134    def makeRequest(self, soapRequest): 
    81135        """Make a request to the given URL with a SOAP Request object""" 
    82136         
    83         if not isinstance(soapRequest, self.soapClass): 
    84             raise TypeError('Request to "%s", expecting %r derived type for ' 
    85                             'SOAP request, got %r' % (url, self.soapClass, 
    86                                                       soapRequest.__class__)) 
     137        if not isinstance(soapRequest, UrlLib2SOAPRequest): 
     138            raise TypeError('UrlLib2SOAPClient.makeRequest: expecting %r ' 
     139                            'derived type for SOAP request, got %r' %  
     140                            (self.responseEnvelopeClass,soapRequest.__class__)) 
     141             
     142        if not isinstance(soapRequest.envelope, self.responseEnvelopeClass): 
     143            raise TypeError('UrlLib2SOAPClient.makeRequest: expecting %r ' 
     144                            'derived type for SOAP envelope, got %r' %  
     145                            (self.responseEnvelopeClass,soapRequest.__class__)) 
    87146                             
    88147        if self.timeout is not None: 
     
    91150            arg = () 
    92151             
    93         result = self.__openerDirector.open(url, soapRequest, *arg) 
    94          
    95         resultStream = StringIO() 
    96         resultStream.write(result) 
    97         resultStream.seek(0) 
    98          
    99         soapResponse = self.soapClass()         
    100         soapResponse.parse(resultStream) 
     152        soapRequestStr = soapRequest.envelope.serialize() 
     153        soapResponse = UrlLib2SOAPResponse() 
     154        soapResponse.fileObject = self.openerDirector.open(soapRequest.url,  
     155                                                           soapRequestStr,  
     156                                                           *arg) 
     157        soapResponse.envelope = self.responseEnvelopeClass()   
     158        soapResponse.envelope.parse(soapResponse.fileObject) 
    101159         
    102160        return soapResponse 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/soap/test_soap.py

    r5521 r5526  
    1616from cStringIO import StringIO 
    1717import paste.fixture 
     18from urllib2 import HTTPHandler 
    1819 
    1920from ndg.security.common.soap.etree import SOAPEnvelope 
     21from ndg.security.common.soap.client import UrlLib2SOAPClient 
    2022 
    2123class SOAPBindingMiddleware(object): 
     
    3436     
    3537class SOAPTestCase(unittest.TestCase): 
     38    endpoint = 'http://localhost:10080/soap' 
    3639     
    3740    def __init__(self, *args, **kwargs): 
     
    7477        print(response.body) 
    7578 
     79    def test03Urllib2Client(self): 
     80         
     81        # Paster based service must be running in separate script 
     82        client = UrlLib2SOAPClient() 
     83         
     84        # ElementTree based envelope class 
     85        client.envelopeClass = SOAPEnvelope 
     86         
     87        request = UrlLib2SOAPRequest() 
     88        request.url = SOAPTestCase.endpoint 
     89        request.envelope = SOAPEnvelope() 
     90        request.envelope.create() 
     91        request = client.soapClass() 
     92        request.create() 
     93         
     94        client.openerDirector.add_handler(HTTPHandler()) 
     95        response = client.makeRequest(request) 
    7696 
    7797if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.