home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / ZSI / twisted / WSresource.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  10.9 KB  |  309 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import sys
  5. import warnings
  6. from zope.interface import classProvides, implements, Interface
  7. from twisted.python import log, failure
  8. from twisted.web.error import NoResource
  9. from twisted.web.server import NOT_DONE_YET
  10. import twisted.web.http as twisted
  11. import twisted.web.resource as twisted
  12. from ZSI import _get_element_nsuri_name, EvaluateException, ParseException
  13. from ZSI.parse import ParsedSoap
  14. from ZSI.writer import SoapWriter
  15. from ZSI import fault
  16. from ZSI.address import Address
  17. from ZSI.ServiceContainer import WSActionException
  18. from interfaces import CheckInputArgs, HandlerChainInterface, CallbackChainInterface, DataHandler
  19.  
  20. class LoggingHandlerChain:
  21.     
  22.     def __init__(self, cb, *handlers):
  23.         self.handlercb = cb
  24.         self.handlers = handlers
  25.         self.debug = len(log.theLogPublisher.observers) > 0
  26.  
  27.     __init__ = CheckInputArgs(CallbackChainInterface, HandlerChainInterface)(__init__)
  28.     
  29.     def processRequest(self, arg, **kw):
  30.         debug = self.debug
  31.         if debug:
  32.             log.msg('--->PROCESS REQUEST: %s' % arg, debug = 1)
  33.         
  34.         for h in self.handlers:
  35.             if debug:
  36.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  37.             
  38.             arg = h.processRequest(arg, **kw)
  39.         
  40.         return self.handlercb.processRequest(arg, **kw)
  41.  
  42.     
  43.     def processResponse(self, arg, **kw):
  44.         debug = self.debug
  45.         if debug:
  46.             log.msg('===>PROCESS RESPONSE: %s' % str(arg), debug = 1)
  47.         
  48.         if arg is None:
  49.             return None
  50.         for h in self.handlers:
  51.             if debug:
  52.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  53.             
  54.             arg = h.processResponse(arg, **kw)
  55.         
  56.         s = str(arg)
  57.         if debug:
  58.             log.msg(s, debug = 1)
  59.         
  60.         return s
  61.  
  62.  
  63.  
  64. class DefaultCallbackHandler:
  65.     classProvides(CallbackChainInterface)
  66.     
  67.     def processRequest(cls, ps, **kw):
  68.         resource = kw['resource']
  69.         request = kw['request']
  70.         method = getattr(resource, 'soap_%s' % _get_element_nsuri_name(ps.body_root)[-1])
  71.         
  72.         try:
  73.             (req_pyobj, rsp_pyobj) = method(ps, request = request)
  74.         except TypeError:
  75.             ex = None
  76.             log.err('ERROR: service %s is broken, method MUST return request, response' % cls.__name__)
  77.             raise 
  78.         except Exception:
  79.             ex = None
  80.             log.err('failure when calling bound method')
  81.             raise 
  82.  
  83.         return rsp_pyobj
  84.  
  85.     processRequest = classmethod(processRequest)
  86.  
  87.  
  88. class WSAddressHandler:
  89.     implements(HandlerChainInterface)
  90.     
  91.     def processRequest(self, ps, **kw):
  92.         resource = kw['resource']
  93.         d = getattr(resource, 'root', None)
  94.         key = _get_element_nsuri_name(ps.body_root)
  95.         if d is None or d.has_key(key) is False:
  96.             raise RuntimeError, 'Error looking for key(%s) in root dictionary(%s)' % (key, str(d))
  97.         d.has_key(key) is False
  98.         self.op_name = d[key]
  99.         self.address = address = Address()
  100.         address.parse(ps)
  101.         action = address.getAction()
  102.         if not action:
  103.             raise WSActionException('No WS-Action specified in Request')
  104.         action
  105.         request = kw['request']
  106.         http_headers = request.getAllHeaders()
  107.         soap_action = http_headers.get('soapaction')
  108.         if soap_action and soap_action.strip('\'"') != action:
  109.             raise WSActionException('SOAP Action("%s") must match WS-Action("%s") if specified.' % (soap_action, action))
  110.         soap_action.strip('\'"') != action
  111.         ps.address = address
  112.         return ps
  113.  
  114.     
  115.     def processResponse(self, sw, **kw):
  116.         if sw is None:
  117.             self.address = None
  118.             return None
  119.         request = kw['request']
  120.         resource = kw['resource']
  121.         if isinstance(request, twisted.web.http.Request) is False:
  122.             raise TypeError, '%s instance expected' % http.Request
  123.         isinstance(request, twisted.web.http.Request) is False
  124.         d = getattr(resource, 'wsAction', None)
  125.         key = self.op_name
  126.         if d is None or d.has_key(key) is False:
  127.             raise WSActionNotSpecified, 'Error looking for key(%s) in wsAction dictionary(%s)' % (key, str(d))
  128.         d.has_key(key) is False
  129.         addressRsp = Address(action = d[key])
  130.         if request.transport.TLS == 0:
  131.             addressRsp.setResponseFromWSAddress(self.address, 'http://%s:%d%s' % (request.host.host, request.host.port, request.path))
  132.         else:
  133.             addressRsp.setResponseFromWSAddress(self.address, 'https://%s:%d%s' % (request.host.host, request.host.port, request.path))
  134.         addressRsp.serialize(sw, typed = False)
  135.         self.address = None
  136.         return sw
  137.  
  138.  
  139.  
  140. class WSAddressCallbackHandler:
  141.     classProvides(CallbackChainInterface)
  142.     
  143.     def processRequest(cls, ps, **kw):
  144.         resource = kw['resource']
  145.         request = kw['request']
  146.         method = getattr(resource, 'wsa_%s' % _get_element_nsuri_name(ps.body_root)[-1])
  147.         
  148.         try:
  149.             (req_pyobj, rsp_pyobj) = method(ps, ps.address, request = request)
  150.         except TypeError:
  151.             ex = None
  152.             log.err('ERROR: service %s is broken, method MUST return request, response' % self.__class__.__name__)
  153.             raise 
  154.         except Exception:
  155.             ex = None
  156.             log.err('failure when calling bound method')
  157.             raise 
  158.  
  159.         return rsp_pyobj
  160.  
  161.     processRequest = classmethod(processRequest)
  162.  
  163.  
  164. class DeferHandlerChain:
  165.     
  166.     def __init__(self, cb, *handlers):
  167.         self.handlercb = cb
  168.         self.handlers = handlers
  169.         self.debug = len(log.theLogPublisher.observers) > 0
  170.  
  171.     __init__ = CheckInputArgs(CallbackChainInterface, HandlerChainInterface)(__init__)
  172.     
  173.     def processRequest(self, arg, **kw):
  174.         reactor = reactor
  175.         import twisted.internet
  176.         Deferred = Deferred
  177.         import twisted.internet.defer
  178.         debug = self.debug
  179.         if debug:
  180.             log.msg('--->DEFER PROCESS REQUEST: %s' % arg, debug = 1)
  181.         
  182.         d = Deferred()
  183.         for h in self.handlers:
  184.             if debug:
  185.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  186.                 log.msg('\thandler callback: %s' % h.processRequest)
  187.             
  188.             d.addCallback(h.processRequest, **kw)
  189.         
  190.         d.addCallback(self.handlercb.processRequest, **kw)
  191.         reactor.callLater(0.0001, d.callback, arg)
  192.         if debug:
  193.             log.msg('===>DEFER PROCESS RESPONSE: %s' % str(arg), debug = 1)
  194.         
  195.         for h in self.handlers:
  196.             if debug:
  197.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  198.             
  199.             d.addCallback(h.processResponse, **kw)
  200.         
  201.         d.addCallback(str)
  202.         return d
  203.  
  204.     
  205.     def processResponse(self, arg, **kw):
  206.         return arg
  207.  
  208.  
  209.  
  210. class DefaultHandlerChainFactory:
  211.     protocol = LoggingHandlerChain
  212.     
  213.     def newInstance(cls):
  214.         return cls.protocol(DefaultCallbackHandler, DataHandler)
  215.  
  216.     newInstance = classmethod(newInstance)
  217.  
  218.  
  219. class WSAddressHandlerChainFactory:
  220.     protocol = DefaultHandlerChain
  221.     
  222.     def newInstance(cls):
  223.         return cls.protocol(WSAddressCallbackHandler, DataHandler, WSAddressHandler())
  224.  
  225.     newInstance = classmethod(newInstance)
  226.  
  227.  
  228. class WSResource(twisted.web.resource.Resource, object):
  229.     encoding = 'UTF-8'
  230.     factory = DefaultHandlerChainFactory
  231.     
  232.     def __init__(self):
  233.         twisted.web.resource.Resource.__init__(self)
  234.  
  235.     
  236.     def _writeResponse(self, response, request, status = 200):
  237.         request.setResponseCode(status)
  238.         if self.encoding is not None:
  239.             mimeType = 'text/xml; charset="%s"' % self.encoding
  240.         else:
  241.             mimeType = 'text/xml'
  242.         request.setHeader('Content-Type', mimeType)
  243.         request.setHeader('Content-Length', str(len(response)))
  244.         request.write(response)
  245.         request.finish()
  246.  
  247.     
  248.     def _writeFault(self, fail, request):
  249.         response = fault.FaultFromException(fail.value, False, fail.tb).AsSOAP()
  250.         self._writeResponse(response, request, status = 500)
  251.  
  252.     
  253.     def render_POST(self, request):
  254.         maybeDeferred = maybeDeferred
  255.         import twisted.internet.defer
  256.         chain = self.factory.newInstance()
  257.         data = request.content.read()
  258.         d = maybeDeferred(chain.processRequest, data, request = request, resource = self)
  259.         d.addCallback(chain.processResponse, request = request, resource = self)
  260.         d.addCallback(self._writeResponse, request)
  261.         d.addErrback(self._writeFault, request)
  262.         return NOT_DONE_YET
  263.  
  264.  
  265.  
  266. class DefaultHandlerChain:
  267.     
  268.     def __init__(self, cb, *handlers):
  269.         self.handlercb = cb
  270.         self.handlers = handlers
  271.         self.debug = len(log.theLogPublisher.observers) > 0
  272.  
  273.     __init__ = CheckInputArgs(CallbackChainInterface, HandlerChainInterface)(__init__)
  274.     
  275.     def processRequest(self, arg, **kw):
  276.         debug = self.debug
  277.         if debug:
  278.             log.msg('--->PROCESS REQUEST: %s' % arg, debug = 1)
  279.         
  280.         for h in self.handlers:
  281.             if debug:
  282.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  283.             
  284.             arg = h.processRequest(arg, **kw)
  285.         
  286.         return self.handlercb.processRequest(arg, **kw)
  287.  
  288.     
  289.     def processResponse(self, arg, **kw):
  290.         debug = self.debug
  291.         if debug:
  292.             log.msg('===>PROCESS RESPONSE: %s' % str(arg), debug = 1)
  293.         
  294.         if arg is None:
  295.             return None
  296.         for h in self.handlers:
  297.             if debug:
  298.                 log.msg('\t%s handler: %s' % (arg, h), debug = 1)
  299.             
  300.             arg = h.processResponse(arg, **kw)
  301.         
  302.         s = str(arg)
  303.         if debug:
  304.             log.msg(s, debug = 1)
  305.         
  306.         return s
  307.  
  308.  
  309.