|
Graham Dumpleton
grahamd at dscpl.com.au
Wed Mar 16 21:41:15 EST 2005
The content length will not be set for a GET, thus I had in mine:
if req.method == "POST":
length = int(req.headers_in["content-length"])
template.req_read.content = req.read(length)
I believe that for a POST, content length must be provided by the
client, certainly for the content types that FieldStorage is designed
to work with.
Davin Boling wrote ..
> (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
> >
|