Ignore:
Timestamp:
29/08/08 08:43:44 (11 years ago)
Author:
pjkersha
Message:

Changed ndgPage.kid in pylons container to allow for Pylons 0.9.7 - some helpers have moved to a sub-package 'rails'

ndg.security.server.wsgi.soap,
ndg.security.server.wsgi.wssecurity: more work on SOAP middleware - add filtering for GET reqests

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/soap.py

    r4020 r4152  
    1414log = logging.getLogger(__name__) 
    1515 
     16import paste.request 
    1617from ZSI import EvaluateException, ParseException 
    1718from ZSI.parse import ParsedSoap 
     
    3031        self.app_conf.update(kw) 
    3132             
    32         if 'pathInfo' not in self.app_conf: 
    33             self.app_conf['pathInfo'] = '/' 
     33        if 'path' not in self.app_conf: 
     34            self.app_conf['path'] = '/' 
    3435         
    3536        if 'ServiceSOAPBindingClass' in self.app_conf: 
     
    4950                  
    5051        self.serviceSOAPBinding = serviceSOAPBindingClass() 
     52        self.enableWSDLQuery = bool() 
     53        if self.app_conf.get('enableWSDLQuery', False) and \ 
     54           hasattr(self.serviceSOAPBinding, '_wsdl'): 
     55            self.enableWSDLQuery = True 
    5156 
    5257        
    5358    def __call__(self, environ, start_response): 
    5459        log.debug("SOAPMiddleware.__call__") 
     60 
     61        def start_response_wrapper(status, response_hdrs, exc_info=None): 
     62            '''Ensure text/xml content type and set content length''' 
     63             
     64            contentKeys = ('content-type', 'content-length') 
     65            response_hdrs_alt = [(name, val) for name, val in response_hdrs\ 
     66                                 if name.lower() not in contentKeys] 
     67             
     68            response_hdrs_alt += [('content-type', 'text/xml'), 
     69                                  ('content-length', str(len(self.soapOut)))] 
     70                             
     71            return start_response(status, response_hdrs_alt, exc_info) 
    5572         
     73        if environ.get('REQUEST_METHOD') == 'GET' and \ 
     74           'wsdl' in dict(paste.request.parse_querystring(environ)): 
     75            if self.enableWSDLQuery: 
     76                wsdl = self.serviceSOAPBinding._wsdl 
     77                start_response("200 OK", [('Content-type', 'text/xml'), 
     78                                          ('Content-length', str(len(wsdl)))]) 
     79                return wsdl 
     80                 
     81                 
    5682        # Apply filter for calls 
    57         if not environ['PATH_INFO'].startswith(self.app_conf['pathInfo']): 
     83        if not self.isSOAPMessage(environ) or \ 
     84           not environ['PATH_INFO'].startswith(self.app_conf['path']): 
    5885            return self.app(environ, start_response) 
    5986 
    60         def start_response_wrapper(status, response_headers, exc_info=None): 
    61             '''Ensure text/xml content type and set content length''' 
    62             response_headers_alt=[(name,val) for name, val in response_headers\ 
    63                     if name.lower() not in ('content-type', 'content-length')] 
    64              
    65             response_headers_alt += [('content-type', 'text/xml'), 
    66                                 ('content-length', "%d" % len(self.soapOut))] 
    67                              
    68             return start_response(status,  
    69                                   response_headers_alt, 
    70                                   exc_info) 
    71  
     87        # Check for ParsedSoap object set in environment, if not present, 
     88        # make one 
    7289        if 'ZSI.parse.ParsedSoap' in environ: 
    7390            ps = environ['ZSI.parse.ParsedSoap'] 
     
    8198             
    8299            ps = ParsedSoap(soapIn) 
    83              
     100         
     101        # Map SOAP Action to method in binding class 
    84102        method = getattr(self.serviceSOAPBinding,  
    85103                         'soap_%s' % environ['HTTP_SOAPACTION'].strip('"')) 
    86104         
     105        # TODO: change method to return response only: request, response tuple 
     106        # is carry over from Twisted based code 
    87107        try: 
    88108            req, resp = method(ps) 
     
    90110            self._writeFault(req, resp) 
    91111         
     112        # Serialize output using SOAP writer class 
    92113        sw = SoapWriter() 
    93114        sw.serialize(resp) 
     
    107128        app = self.app(environ, start_response_wrapper) 
    108129        #start_response("200 OK", [('Content-type', 'text/xml')]) 
    109         return [self.soapOut] 
     130        return self.soapOut 
    110131 
    111  
     132    @classmethod 
     133    def isSOAPMessage(cls, environ): 
     134        '''Generic method to filter out non-soap messages''' 
     135        return environ.get('REQUEST_METHOD', '') == 'POST' and \ 
     136               environ.get('HTTP_SOAPACTION') is not None 
     137         
     138         
    112139def makeFilter(app, app_conf):   
    113140    from ndgsecurity.config.attributeauthority import AttributeAuthorityWS 
     
    115142    return SOAPMiddleware(app, app_conf, 
    116143                          ServiceSOAPBinding=AttributeAuthorityWS(), 
    117                           pathInfo='/AttributeAuthority') 
     144                          path='/AttributeAuthority') 
Note: See TracChangeset for help on using the changeset viewer.