-----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@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-----