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

Peter Bengtsson peter at fry-it.com
Thu Oct 12 13:09:42 EDT 2006



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.

> 
> 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-----
> 
> _______________________________________________
> Zope maillist  -  Zope at zope.org
> http://mail.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists - 
>  http://mail.zope.org/mailman/listinfo/zope-announce
>  http://mail.zope.org/mailman/listinfo/zope-dev )
> 

-- 
Peter Bengtsson,
work www.fry-it.com
home www.peterbe.com
hobby www.issuetrackerproduct.com


More information about the Zope mailing list