[Zope] Re: Sending XML straight down to a zope

Jonathan dev101 at magma.ca
Thu Oct 12 13:21:28 EDT 2006


----- Original Message ----- 
From: "Peter Bengtsson" <peter at fry-it.com>
To: "Tres Seaver" <tseaver at palladion.com>
Cc: <zope at zope.org>
Sent: Thursday, October 12, 2006 1:09 PM
Subject: Re: [Zope] Re: Sending XML straight down to a zope


>
>
> Tres Seaver wrote:
>> -----BEGIN PGP SIGNED MESSAGE-----
>> Hash: SHA1
>>
>> Peter Bengtsson wrote:
>>> I'm trying to send an XML straight into Zope without specifying it as
>>> a parameter and with a Content-Length. It seems that Zope's mapply
>>> function or whatever it's called digests the raw http body and tries
>>> to turn it into parameters?
>>>
>>>
>>> Here's the code on the Zope server (uploadExpenseXML()):
>>> def uploadExpenseXML(self):
>>>    return str(self.REQUEST.form.keys())
>>>
>>>
>>> Here's the dummy code that sends the XML into my Zope:
>>>
>>> xml_content = open('validxmlfile.xml').read()
>>> http = httplib.HTTP("localhost", 8080)
>>> http.putrequest("POST", "/uploadExpenseXML")
>>> http.putheader("User-Agent", "Simple")
>>> http.putheader("Host", "localhost")
>>> http.putheader("Content-Length", "%d" % len(xml_content))
>>> http.endheaders()
>>> http.send(xml_content)
>>> reply, message, headers = http.getreply()
>>> print http.getfile().read()
>>>
>>>
>>> The result I get is:
>>> ['<?xml version']
>>>
>>> If I debug the value of that single REQUEST.form variable, it starts
>>> like this:
>>> '"1.0" encoding="ISO-8859-1" standalone="yes" ?>\n<XMLExpense
>>> Version="1.0">
>>>
>>> Obviously, one solution would be to ask the XML sending company to not
>>> post it like this but instead post it by parameter which I know will
>>> work.
>>> But, what if I can't change their minds?
>>>
>>>
>>>
>>> PS. When faced with the same problem a long time ago I ended up
>>> writing a mod_python app running one a different port that converted
>>> the http post from mod_python into a parameter based http post. I
>>> don't want to have to do that again.
>>
>> Stock Zope can only handle POST request with XML payloads if they
>> conform to the XMLRPC spec:  they must have the 'Content-type' header of
>> 'text/xml', and the document must be encoded as an xmlrpc request.
>>
>> If you can get the vendor to use a PUT request instead of a POST, you
>> could process the result inside a custom object'c 'PUT' method.
>> Otherwise, you are going to need to create a custom derivative of
>> ZPublisher.HTTPRequest, and override its 'processInputs' to handle the
>> vendor's non-standard dump.  You could make that server listen on a
>> different port, for instance (I'm guessing you can tell them what URL to
>> POST to, right?)
>>
>
> Cool. Thanks for the suggestion. I've tried to make them change the way 
> they post it to me and if that's not possible I'll consider your advice 
> about either PUT or digging into ZPublisher which I was hoping not to have 
> to do.

As an alternative strategy, how about:

i) set up a url just for this problem user
ii) us apache rewrite to redirect to a non-zope cgi script
iii) use the cgi script to 'fix' the xml
iv) do a redirect with the fixed xml to a 'zope' url

This would allow you to run a standard zope installation (running a hacked 
installation is a maintenance nightmare), and if the problem user ever gets 
their act together, you just change the apache rewrite rule so that they are 
delivered straight to your zope application.

Just a thought...


Jonathan 




More information about the Zope mailing list