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

Tres Seaver tseaver at palladion.com
Wed Oct 11 11:51:51 EDT 2006

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?)

- --
Tres Seaver          +1 202-558-7113          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
Version: GnuPG v1.4.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org


More information about the Zope mailing list