[Zope] Re: Sending XML straight down to a zope
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))
>>> 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
>>> 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
>>> 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...
More information about the Zope