Davin Boling
davin at wordpainter.net
Wed Mar 16 21:35:35 EST 2005
(forgive the double-mail Graham, replied direct and didn't hit the list by accident) I took your suggestion involving time.sleep, but it made no difference. As for grabbing the content-length in the method you described...the plot thickens! Using your code at the very beginning of the handler(req):, I get the following exception: Mod_python error: "PythonHandler handler" Traceback (most recent call last): File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 299, in HandlerDispatch result = object(req) File "/home/davin/public_html/demo/handler/__init__.py", line 83, in handler length = int(req.headers_in["content-length"]) KeyError: 'content-length' Graham Dumpleton wrote: > Davin Boling wrote .. > >>I've got an example that works correctly already. The problem is that in >>the larger handler that I've written, SOMETHING is breaking. I can't >>understand at all why req.read() returns nothing on a POST when it's the >>very first thing I assign to a variable. I'm about to go on a commenting >>crusade to narrow down where the problem is. >> >>This is my "from scratch" handler, which works correctly...just to show >>that I know how to handle a POST: >> >> >>from mod_python import apache >> >>def handler(req): >> head = """ >> <?xml version="1.0" encoding="utf-8"?> >> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" >> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> >> <html> >> <head> >> <title>Debug</title> >> </head> >> <body> >> """ >> data = req.read() >> method = req.method >> req.content_type = "text/html" >> req.write(head + data + method + '</body></html>') >> return apache.OK > > > Get the content length out of the headers and supply it to req.read() > and see if that makes a difference. Ie., > > length = int(req.headers_in["content-length"]) > data = req.read(length) > > Also note what documentation says about timeouts. > > read([len]) > > Reads at most len bytes directly from the client, returning a string > with the data read. If the len argument is negative or omitted, reads > all data given by the client. > > This function is affected by the Timeout Apache configuration directive. > The read will be aborted and an IOError raised if the Timeout is reached > while reading client data. > > This function relies on the client providing the Content-length header. > Absence of the Content-length header will be treated as if > Content-length: 0 was supplied. > > Incorrect Content-length may cause the function to try to read more > data than available, which will make the function block until a Timeout > is reached. > > One would expect an IOError according to this if a timeout occured, but > maybe it isn't being generated for some reason. > > You might also add: > > time.sleep(10) > > at the start of your handler and see if it makes a difference. Ie., try and > determine if it is the time the client takes to send the post data. > > Graham >
|