|
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
>
|