Graham Dumpleton
grahamd at dscpl.com.au
Wed Apr 5 17:56:36 EDT 2006
On 06/04/2006, at 2:17 AM, Harold J. Ship wrote: > Maybe so, but on another platform using cgi it's ok. If it isn't formatted per the standards for how multipart forms are meant to be formatted, that it may be accepted on platform does not matter as there are no guarantees it will be accepted on another. Anyway, to settle this, capture your post data again using that handler, but change the handler to: from mod_python import apache import base64 def handler(req): data = open("/some/path/post.dat", "wb") data.write(base64.encodestring(req.read())) data.close() req.content_type = 'text/plain' req.write("Done") return apache.OK By encoding it as base64 before being sent, we know for sure that nothing about how it was written to file or dealt with by any mail software will stuff up CR LF sequences and we can see exactly what was received. Graham > -----Original Message----- > From: Jim Gallacher > Sent: Wednesday, April 05, 2006 2:32 PM > To: Graham Dumpleton > Cc: Harold J. Ship; mod_python at modpython.org > Subject: Re: [mod_python] ValueError with Flash 8 > FileReference.upload(url) > > I don't have time to look at this in any detail right now, but I agree > that it looks malformed. The last part of post.dat really shoud be: > > ------------KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7\r\n > Content-Disposition: form-data; name="Upload"\r\n \r\n Submit Query > \r\n > ------------KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7 > > > mod_python 3.2.8 should handle embedded \r\n or \r\r sequences in the > file contents correctly. There is even a unit test for this. ;) > > Jim > > > Graham Dumpleton wrote: >> I am coming to the conclusion that the file produced by Flash is >> malformed. >> >> Even if I were to get rid of the double \r\r sequences, replacing >> them with a single \r, you end up with no blank like after: >> >> Content-Disposition: form-data; name="Upload" >> >> which means that: >> >> Submit Query >> >> gets interpreted as a header and thus why it dies as there is no >> colon on that line. >> >> Anyone got any better ideas? >> >> Bedtime for me now. >> >> Graham >> >> On 05/04/2006, at 9:32 PM, Graham Dumpleton wrote: >> >>> >>> On 05/04/2006, at 9:28 PM, Harold J. Ship wrote: >>> >>>> Ok, here's the output. >>>> >>>> ------------KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7 >>>> >>>> Content-Disposition: form-data; name="Filename" >>>> >>>> >>>> >>>> sample.txt >>>> >>>> ------------KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7 >>>> >>>> Content-Disposition: form-data; name="Filedata"; > filename="sample.txt" >>>> >>>> Content-Type: application/octet-stream >>>> >>>> >>>> >>>> Start of Sample Text File Contents >>>> >>>> End of Sample Text File Contents >>>> >>>> >>>> >>>> ------------KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7 >>>> >>>> Content-Disposition: form-data; name="Upload" >>>> >>>> Submit Query >>>> >>>> ------------KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7 >>> >>> >>> I'm not an expert on FieldStorage as I stayed out of all the >>> discussions on it when it was being improved. I am also not up on >>> what the content type application/x-www-form-urlencoded is all >>> about. All the same, I'll share what I found so far in case it >>> helps > >>> someone else. >>> >>> First off, I don't get an error, but I don't believe I get correct >>> results either. >>> To test, what I did was create a handler containing: >>> >>> from mod_python import apache, util >>> >>> def handler(req): >>> >>> apache.log_error('headers_in=%s'%req.headers_in) >>> >>> req.content_type = 'text/plain' >>> >>> form = util.FieldStorage(req) >>> >>> for field in form.list: >>> apache.log_error('name=%s' % `field.name`) >>> apache.log_error('value=%s' % `field.value`) >>> >>> req.write('done') >>> >>> return apache.OK >>> >>> >>> I then used "ab" to post your file to a URL mapping to that handler. >>> >>> ab -p post.dat -T 'multipart/form-data; boundary=---------- >>> KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7^M' http://localhost:8082/testing/ >>> upload-1/dummy >>> >>> Note that that is actually a real \r (CR) where ^M is shown in the >>> boundary. >>> Without that it wouldn't work. I am not sure though whether that is >>> simply due to CR LF weirdness in way file was created and then >>> how it > >>> is being interpreted by "ab" on Mac OS X when given to it as input. >>> >>> Anyway, result of that is: >>> >>> [Wed Apr 05 21:26:24 2006] [error] headers_in={'Content-type': >>> 'multipart/form-data; boundary=---------- >>> KM7GI3gL6cH2gL6gL6cH2gL6cH2KM7\r', 'Content-length': '498', > 'Accept': >>> '*/*', 'Host': 'localhost:8082', 'User-Agent': 'ApacheBench/1.3d'} >>> [Wed Apr 05 21:26:24 2006] [error] [client 127.0.0.1] PythonHandler >>> upload: Traceback (most recent call last): >>> [Wed Apr 05 21:26:24 2006] [error] [client 127.0.0.1] PythonHandler >>> upload: File "/System/Library/Frameworks/Python.framework/ >>> Versions/2.3/lib/python2.3/site-packages/mod_python/apache.py", >>> line > >>> 308, in HandlerDispatch\n result = object(req) >>> [Wed Apr 05 21:26:24 2006] [error] [client 127.0.0.1] PythonHandler >>> upload: File "/Users/grahamd/Workspaces/testing/upload-1/ >>> upload.py", line 9, in handler\n form = util.FieldStorage(req) >>> [Wed Apr 05 21:26:24 2006] [error] [client 127.0.0.1] PythonHandler >>> upload: File "/System/Library/Frameworks/Python.framework/ >>> Versions/2.3/lib/python2.3/site-packages/mod_python/util.py", line >>> 180, in __init__\n h, v = line.split(":", 1) >>> [Wed Apr 05 21:26:24 2006] [error] [client 127.0.0.1] PythonHandler >>> upload: ValueError: unpack list of wrong size >>> >>> Thus, have duplicated it. >>> >>> Note that this may possibly be something to do with strangeness in >>> line endings. >>> First their was the issue above with CR, but there are other >>> nasties > >>> in input with CR LF. See following "od" dump. >>> >>> 0000000 - - - - - - - - - - - - K >>> M 7 > G >>> 0000020 I 3 g L 6 c H 2 g L 6 g L >>> 6 c > H >>> 0000040 2 g L 6 c H 2 K M 7 \r \r \n >>> C o > n >>> 0000060 t e n t - D i s p o s i t >>> i o > n >>> 0000100 : f o r m - d a t a ; >>> n a > m >>> 0000120 e = " F i l e n a m e " \r >>> \r \n > \r >>> 0000140 \r \n s a m p l e . t x t \r >>> \r \n > - >>> 0000160 - - - - - - - - - - - K M >>> 7 G > I >>> 0000200 3 g L 6 c H 2 g L 6 g L 6 >>> c H > 2 >>> 0000220 g L 6 c H 2 K M 7 \r \r \n C >>> o n > t >>> 0000240 e n t - D i s p o s i t i >>> o n > : >>> 0000260 f o r m - d a t a ; n >>> a m > e >>> 0000300 = " F i l e d a t a " ; >>> f i > l >>> 0000320 e n a m e = " s a m p l >>> e . t > x >>> 0000340 t " \r \r \n C o n t e n t - >>> T y > p >>> 0000360 e : a p p l i c a t i o >>> n / > o >>> 0000400 c t e t - s t r e a m \r \r >>> \n \r > \r >>> 0000420 \n S t a r t o f S a m >>> p l > e >>> 0000440 T e x t F i l e C o >>> n t > e >>> 0000460 n t s \r \r \n E n d o f >>> S a > m >>> 0000500 p l e T e x t F i l >>> e C > o >>> 0000520 n t e n t s \r \r \n \r \r \n - >>> - - > - >>> 0000540 - - - - - - - - K M 7 G I >>> 3 g > L >>> 0000560 6 c H 2 g L 6 g L 6 c H 2 >>> g L > 6 >>> 0000600 c H 2 K M 7 \r \r \n C o n t >>> e n > t >>> 0000620 - D i s p o s i t i o >>> n : f > o >>> 0000640 r m - d a t a ; n a m e >>> = " > U >>> 0000660 p l o a d " \r \r \n S u b m i t >>> 0000700 Q u e r y \r \r \n - - - - - >>> - - > - >>> 0000720 - - - - K M 7 G I 3 g L 6 >>> c H > 2 >>> 0000740 g L 6 g L 6 c H 2 g L 6 c >>> H 2 > K >>> 0000760 M 7 >>> 0000762 >>> >>> See the "\r \r \n \r \r \n" sequences. >>> >>> Not sure that I'll have much more time to play with this >>> tonight, so > >>> posting this progress in case someone else wants to pick up and >>> continue. >>> >>> Graham >>> >>> >>> >>> >>> >>> _______________________________________________ >>> Mod_python mailing list >>> Mod_python at modpython.org >>> http://mailman.modpython.org/mailman/listinfo/mod_python >> >> >> _______________________________________________ >> Mod_python mailing list >> Mod_python at modpython.org >> http://mailman.modpython.org/mailman/listinfo/mod_python >> >
|