|
- diff -urN Zope-2.6.2-linux2-x86/lib/python/ZPublisher/HTTPRequest.py Zope-2.6.2-linux2-x86.1/lib/python/ZPublisher/HTTPRequest.py
- --- Zope-2.6.2-linux2-x86/lib/python/ZPublisher/HTTPRequest.py 2003-04-09 16:00:27.000000000 +0200
- +++ Zope-2.6.2-linux2-x86.1/lib/python/ZPublisher/HTTPRequest.py 2003-11-12 14:51:01.000000000 +0100
- @@ -24,6 +24,7 @@
- from TaintedString import TaintedString
- from maybe_lock import allocate_lock
- xmlrpc=None # Placeholder for module that we'll import if we have to.
- +soap=None # Placeholder for module that we'll import if we have to.
-
- #cgi hotfix:
- if not hasattr(cgi, 'valid_boundary'):
- @@ -369,16 +370,26 @@
- meth=None
- fs=FieldStorage(fp=fp,environ=environ,keep_blank_values=1)
- if not hasattr(fs,'list') or fs.list is None:
- - # Hm, maybe it's an XML-RPC
- + # Hm, maybe it's an XML-RPC or SOAP
- if (fs.headers.has_key('content-type') and
- - fs.headers['content-type'] == 'text/xml' and
- + fs.headers['content-type'][:8] == 'text/xml' and
- method == 'POST'):
- - # Ye haaa, XML-RPC!
- - global xmlrpc
- - if xmlrpc is None: import xmlrpc
- - meth, self.args = xmlrpc.parse_input(fs.value)
- - response=xmlrpc.response(response)
- - other['RESPONSE']=self.response=response
- + if environ.has_key('HTTP_SOAPACTION'):
- + # this is a SOAP request
- + global soap
- + if soap is None:
- + import soap
- + meth, self.args = soap.parse_input(fs.value)
- + response = soap.response(response)
- + other['RESPONSE'] = self.response = response
- + other['REQUEST_METHOD'] = ''
- + else:
- + # Ye haaa, XML-RPC!
- + global xmlrpc
- + if xmlrpc is None: import xmlrpc
- + meth, self.args = xmlrpc.parse_input(fs.value)
- + response=xmlrpc.response(response)
- + other['RESPONSE']=self.response=response
- self.maybe_webdav_client = 0
- else:
- self._file=fs.file
- diff -urN Zope-2.6.2-linux2-x86/lib/python/ZPublisher/soap.py Zope-2.6.2-linux2-x86.1/lib/python/ZPublisher/soap.py
- --- Zope-2.6.2-linux2-x86/lib/python/ZPublisher/soap.py 1970-01-01 01:00:00.000000000 +0100
- +++ Zope-2.6.2-linux2-x86.1/lib/python/ZPublisher/soap.py 2003-11-12 14:51:01.000000000 +0100
- @@ -0,0 +1,125 @@
- +"""SOAP support module
- +
- +by Antonio Beamud Montero <antonio.beamud@linkend.com>
- +
- +Based on the XML-RPC Zope support module written by Eric Kidd at UserLand
- +software and the modifications made by Petru Paler, with much help
- +from Jim Fulton at DC.
- +
- +This code hooks Zope up to SOAPpy library.
- +"""
- +
- +import sys
- +from string import replace
- +from HTTPResponse import HTTPResponse
- +from SOAPpy import *
- +from zLOG import LOG, PROBLEM, ERROR, DEBUG, INFO,TRACE
- +
- +Config.specialArgs=0.
- +
- +def parse_input(data):
- + """Parse input data and return a method path and argument tuple
- +
- + The data is a string.
- + """
- + obj = Parser.parseSOAPRPC(data)
- + method = obj._name
- + args = tuple(obj._aslist)
- +
- + # Translate '.' to '/' in meth to represent object traversal.
- + method = replace(method, '.', '/')
- + return method, args
- +
- +# See below
- +#
- +# def response(anHTTPResponse):
- +# """Return a valid ZPublisher response object
- +#
- +# Use data already gathered by the existing response.
- +# The new response will replace the existing response.
- +# """
- +# # As a first cut, lets just clone the response and
- +# # put all of the logic in our refined response class below.
- +# r=Response()
- +# r.__dict__.update(anHTTPResponse.__dict__)
- +# return r
- +
- +
- +
- +
- +#######################################################################
- +# New Object response based on SoapPy
- +#
- +class SOAPResponse:
- + def __init__(self, real): self.__dict__['_real']=real
- + def __getattr__(self, name): return getattr(self._real, name)
- + def __setattr__(self, name, v): return setattr(self._real, name, v)
- + def __delattr__(self, name): return delattr(self._real, name)
- +
- + def setBody(self, body, title='', is_error=0, bogus_str_search=None):
- + # Marshall our body as an SOAP response. Strings will be sent
- + # strings, integers as integers, etc. We do *not* convert
- + # everything to a string first.
- + status = 200
- + if isinstance(body, Types.faultType):
- + status = 500
- + # Convert Fault object to SOAP response.
- + soapbody = Types.faulType("%s:Server" % NS.ENV_T, body)
- + body = buildSOAP(soapbody,encoding=None)
- + else:
- + try:
- + body = buildSOAP((body,),encoding=None)
- + except Exception,e:
- + self.exception()
- + return self
- +
- + t = 'text/xml'
- + # Set our body to the XML-RPC message, and fix our MIME type.
- + self._real.setBody(body)
- + self._real.setHeader('content-type', t)
- + self._real.setHeader("content-length", str(len(body)))
- + self._real.setStatus(status)
- + return self
- +
- + def exception(self, fatal=0, info=None,
- + absuri_match=None, tag_search=None):
- + # Fetch our exception info. t is type, v is value and tb is the
- + # traceback object.
- +
- + if type(info) is type(()) and len(info)==3: t,v,tb = info
- + else: t,v,tb = sys.exc_info()
- + LOG('SOAPException', TRACE, tb)
- + # Create an appropriate Fault object. Unfortunately, we throw away
- + # most of the debugging information. More useful error reporting is
- + # left as an exercise for the reader.
- + Fault=Types.faultType
- + f=None
- + try:
- + if isinstance(v, Fault):
- + f=v
- + elif isinstance(v, Exception):
- + f=Fault("%s:Server" % NS.ENV_T,
- + "Unexpected Zope exception: %s"%str(v))
- + else:
- + f=Fault("%s:Server" % NS.ENV_T,
- + "Unexpected Zope error value: %s"%str(v))
- + except:
- + f=Fault("%s:Server" % NS.ENV_T,
- + "Unknown Zope fault type")
- +
- + # Do the damage.
- + body = buildSOAP(f)
- + self._real.setBody(body)
- + self._real.setHeader('content-type', 'text/xml')
- + self._real.setStatus(500)
- + return tb
- +
- +response=SOAPResponse
- +
- +
- +
- +
- +
- +
- +
- +
|