Graham Dumpleton
grahamd at dscpl.com.au
Wed Mar 16 21:28:15 EST 2005
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
|