Emiliano Moscato
moski666 at gmail.com
Tue Jan 16 17:11:33 EST 2007
Hi Graham: The point is that the post method to send xforms give you an xml document with all the xforms data. I understand that it have no sense to make a dictionary of the xml document, because the goal is to handle the data as an structured xml document. Maybe I am wrong trying to use publisher that makes dictionaries with the form data... Regards. Emiliano 2007/1/16, Graham Dumpleton <grahamd at dscpl.com.au>: > > Emiliano Moscato wrote .. > > Hi all: > > > > I've added this few lines to FieldStorage and it works fine for me: > > > > if ctype.lower() == "application/xml": > > from xml.dom.minidom import parseString > > xml = req.read(clen) > > try: > > parseString(xml) > > except: > > raise apache.SERVER_RETURN, apache.HTTP_BAD_REQUEST > > req.xml = xml > > return > > > > Is this interesting for a patch? > > Regards > > > > Emiliano > > It doesn't really fit in with what FieldStorage is meant to do which is to > decode a post request and convert form parameters into a dictionary > for use. All your code does is leave the content as an attribute of req > for something else to deal with. In essence, all you are doing is hacking > FieldStorage to get around the limitation described in: > > http://issues.apache.org/jira/browse/MODPYTHON-29 > > If you just want to get around that limitation, you might want to instead > look at 'vampire::publisher' from: > > http://www.dscpl.com.au/projects/vampire/ > > Vampire contains a distinct implementation of publisher which does not > have the limitation and so in your published function you would be > able to simply do: > > def index(req): > if req.headers_in['Content-Type'] == 'application/xml': > ... > > This will work because 'vampire::publisher' doesn't error when content > type > doesn't equate to something FieldStorage can't handle, instead it just > lets > the function deal with it. > > For any change to FieldStorage to be accepted in this area, it would have > to properly decode any xforms POST into key/value lists as appropriate and > populate the FieldStorage data structure. That is if that makes sense as I > haven't looked at what is in an xforms POST and whether it is equivalent > to normal form POST but just a different format. > > Graham > > > 2007/1/12, Graham Dumpleton <grahamd at dscpl.com.au>: > > > > > > If you are using mod_python 3.2.10 or earlier, try 3.3.0b as it has > some > > > fixesto FieldStorage class. Can be downloaded from: > > > > > > http://httpd.apache.org/modules/python-download.cgi > > > > > > I suspect though that it still will not work though, as code is: > > > > > > # figure out boundary > > > try: > > > i = ctype.lower().rindex("boundary=") > > > boundary = ctype[i+9:] > > > if len(boundary) >= 2 and boundary[0] == boundary[-1] == > > '"': > > > boundary = boundary[1:-1] > > > boundary = re.compile("--" + re.escape(boundary) + > > > "(--)?\r?\n") > > > > > > Ie., it assumes that boundary is last field on content type line which > > is > > > a > > > bad assumption. > > > > > > Graham > > > > > > On 13/01/2007, at 8:41 AM, Emiliano Moscato wrote: > > > > > > Hi all! > > > > > > Thanks for your answers. > > > I've been looking the code of FieldStorage and publisher. I think it > > is > > > not soo dificult to patch FieldStorage, but: Is anybody else > interested > > in > > > patch FieldStorage? If so I'll try it on monday. > > > > > > On the other hand, I've trying to use another method to send my xforms > > > which uses "multipart/related" as Content-type and I realized that > mozilla > > > xforms plugin sends a boundary that is bad handled by > > > publisher-FieldStorage. This is what browser sends: > > > > > > [...] > > > Content-Length: 522 > > > Content-Type: multipart/related; > > > boundary=---------------------------13592280651221337293469391600; > > > type="application/xml"; start="<4c599da9.58c746e8 at mozilla.org >" > > > Cookie: lang=1 > > > > > > -----------------------------13592280651221337293469391600 > > > Content-Type: application/xml > > > Content-ID: <4c599da9.58c746e8 at mozilla.org> > > > > > > <?xml version="1.0" encoding="UTF-8"?> > > > <idioma xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev=" > http://www.w3.org/2001/xml-events" > > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" > http://www.w3.org/2001/XMLSchema > > > "> > > > > > > <H__interface>main</H__interface> > > > <idioma>adadsfasd</idioma> > > > </idioma> > > > -----------------------------13592280651221337293469391600-- > > > > > > > > > But FieldStorage parse the content-type line up to the end trying to > > get > > > boundary, getting this as boundary: > > > -----------------------------7393760691212604279930853199; > > > type="application/xml"; start="< b8f2849.19571884 at mozilla.org> > > > > > > Is this a firefox problem or a FieldStorage problem? > > > Regards, enjoy the weekend :) > > > > > > Emiliano > > > > > > > > > 2007/1/12, Jim Gallacher <jpg at jgassociates.ca>: > > > > > > > > Graham Dumpleton wrote: > > > > > Jim Gallacher wrote .. > > > > >> Emiliano Moscato wrote: > > > > >>> Hi all! > > > > >>> > > > > >>> I'm getting crazy trying to receive xforms xml data with > mod_python > > > > + > > > > >>> publisher handler. > > > > > > > > > > In what way are you using mod_python.publisher? Depending to what > > > > > degree you are using it, mod_python 3.3 offers some alternate > > > > mechanisms > > > > > for doing basic dispatch against different resources which might > > be > > > > more > > > > > useful and allow you to still access content of response to decode > > it. > > > > > > > > > >>> In a normal HTML form, the data would be sent as > > > > >>> application/x-www-form-urlencoded, in the XForms world however, > > this > > > > > > > > >>> information is sent as XML formatted data (application/xml). > > > > >>> Up to now I've used cherryPy as web server and I've got my xml > > data > > > > with > > > > >>> cherrypy.threadData.xform. > > > > >>> I've read that PHP receive this in $HTTP_RAW_POST_DATA variable. > > If > > > > I > > > > >> send > > > > >>> the form to a php script all work fine. > > > > >>> But when I try to submit a xforms with method POST to a script > > > > managed > > > > >> by > > > > >>> publisher handler I get an error with no log in my apache server > > > > error > > > > >> log. > > > > >>> Any help? > > > > >> You'll need to elaborate on the error you are getting, but I > think > > > > part > > > > >> of the problem is that you are bumping up against part of the > > > > internal > > > > >> "magic" of publisher. > > > > >> > > > > >> Publisher automatically creates a FieldStorage instance. > > > > Unfortunately > > > > >> FieldStorage assumes that the content-type starts with either > > > > >> "application/x-www-form-urlencoded" or "multipart/". If I had to > > > > guess > > > > >> I'd say that you are getting "501 Not Implemented error" as a > result. > > > > > > > > >> > > > > >> Here are a couple of solutions that you might consider as a > > > > workaround: > > > > >> > > > > >> 1. Hack util.FieldStorage to properly handle your content-type. > > If > > > > you > > > > >> do this feel free to submit a patch so FieldStorage can be fixed. > > ;) > > > > > > > > > > Hmmm, xforms is quite different. > > > > > > > > > > http://www.w3.org/TR/xforms/ > > > > > > > > > > Looks like a lot of work. > > > > > > > > Probably. I certainly wasn't offering to do it. ;) > > > > > > > > >> 2. Hack publisher to skip the automatic creation of FieldStorage. > > > > (Line > > > > >> 424 in publisher.py for mod_python 3.3.0b). You can then use > req.read > > > > () > > > > >> to read and process the POST'd data within your content handler. > > > > > > > > > > I've raised this issue before about publisher not being able to > accept > > > > other > > > > > content types. See: > > > > > > > > > > http://issues.apache.org/jira/browse/MODPYTHON-29 > > > > > > > > > > Also, like PSP now does, publisher could be made to use 'req.form' > > if > > > > it > > > > > already existed. This would allow a stacked response handler > before > > > > > publisher to decide whether some other form content was supplied, > > > > decode > > > > > it and set req.form to a compatible class to FieldStorage. I don't > > > > know that I > > > > > have created an issue for that idea before, but have certainly > thought > > > > > about it and perhaps mentioned it on the mailing list. > > > > > > > > That seems like a reasonable solution. > > > > > > > > >> 3. Use a PythonFixupHandler before the content handler. In the > > > > >> fixuphandler use req.read() to grab the raw data and adjust the > > > > >> content-type header so that FieldStorage doesn't bomb out. Note > > that > > > > if > > > > >> you want to pass xml field data as parameters to your handler > method > > > > >> you'll need to do a bit more work. For example > > > > >> > > > > >> def index(foo="bar"): > > > > >> return "whatever" > > > > >> > > > > >> won't get foo from your xml data. You can likely work around this > > but > > > > >> you'll need to take a look at the source for FieldStorage and > > > > publisher > > > > >> to work out a strategy. > > > > > > > > > > If you are talking about modifying the input stream, an input > filter > > > > would > > > > > perhaps be better. Not sure that that will help since xforms is > quite > > > > > different and isn't just a matter of changing content type. > > > > > > > > No, I was just thinking you could get the raw data with req.read() > > > > (parsing the xml or whatever) and then set the content-type to > > > > application/x-www-form-urlencoded. That way the subsequent call to > > > > FieldStorage within publisher won't bomb out. The code would look > > > > something like this: > > > > > > > > def fixuphandler(req): > > > > if req.headers_in.has_key("content-type"): > > > > ctype = req.headers_in["content-type"] > > > > if ctype.startswith("application/xml"): > > > > req.data = parse_the_xml_data_or_whatever(req.read()) > > > > req.headers_in["content-type"] = > > > > "application/x-www-form-urlencoded" > > > > return apache.OK > > > > > > > > A little too hackish perhaps? (Assuming it would even work). > > > > > > > > Jim > > > > _______________________________________________ > > > > Mod_python mailing list > > > > Mod_python at modpython.org > > > > http://mailman.modpython.org/mailman/listinfo/mod_python > > > > > > > > > > > > > > > > -- > > > mOsKi > > > "No hay nada que uno haga mal , lo que hay es poco vino." Autor > Anonimo > > > _______________________________________________ > > > Mod_python mailing list > > > Mod_python at modpython.org > > > http://mailman.modpython.org/mailman/listinfo/mod_python > > > > > > > > > > > > > > > -- > > mOsKi > > "No hay nada que uno haga mal , lo que hay es poco vino." Autor Anonimo > -- mOsKi "No hay nada que uno haga mal , lo que hay es poco vino." Autor Anonimo -------------- next part -------------- An HTML attachment was scrubbed... URL: http://mm_cfg_has_not_been_edited_to_set_host_domains/pipermail/mod_python/attachments/20070116/e1044dd4/attachment-0001.html
|