[Zope] Re: Sending XML straight down to a zope
Tres Seaver
tseaver at palladion.com
Wed Oct 11 11:51:51 EDT 2006
-----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?)
Tres.
- --
===================================================================
Tres Seaver +1 202-558-7113 tseaver at palladion.com
Palladion Software "Excellence by Design" http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFFLRMX+gerLs4ltQ4RAuLVAJ9YJUQBTQzWxwEFlC5Wq/3OhUAVqACfUslN
YgO7r1gy0aepLprIi0S8LNo=
=ZHoA
-----END PGP SIGNATURE-----
More information about the Zope
mailing list