[mod_python] Re: Chunked encoding

Graham Dumpleton grahamd at dscpl.com.au
Sat Feb 18 19:09:03 EST 2006


On 19/02/2006, at 9:14 AM, Dan Eloff wrote:

> I'm curious about this "chunked encoding" what does that mean? I  
> output all my pages in my handler as a single string, so I have a  
> sort of interest in understanding what the write method does. If  
> I'm to take a wild guess at how the below works, you set the  
> content length so that mod_python realizes when it recieves your  
> data string that no more is coming and it doesn't need to copy the  
> string into a buffer, it can just keep a reference to it? And  
> somehow the act of buffering the data as opposed to writing it  
> immediately causes mod_python not to emply this "chunked encoding"?
>
> It'd be great if someone explained this to me :)
>
> Thanks,
> -Dan
>
> On 2/15/06, Lars Eriksen <downgrade at gmx.org > wrote:Yes, there  
> is :-) RTFM, I guess ...
>
> from mod_python.util import *
> from mod_python import apache
>
> def handle(req):
>     data = 'No chunking involved.' * 1024
>     req.set_content_length(len(data))
>     req.write(data, 0)
>     req.flush()
>     return apache.OK

As far as I can tell, there is no difference between that and:

def handler(req):
     data = 'No chunking involved.' * 1024
     req.set_content_length(len(data))
     req.write(data)
     return apache.OK

When no second argument is supplied to req.write(), it automatically  
flushes.

In this particular case, since there is only one call to req.write(),  
it is also
probably equivalent to:

def handler(req):
     data = 'No chunking involved.' * 1024
     req.set_content_length(len(data))
     req.write(data,0)
     return apache.OK

That is, returning apache.OK is going to have the same effect of  
flushing the
buffered data if there is any.

FWIW, chunked encoding is only of relevance to HTTP/1.1 clients. You  
as the
provider of the handler does not really have to care about it as  
Apache will
worry about it and use it if the client is capable of handling HTTP/ 
1.1. That is,
mod_python doesn't do anything about chunked encoding either.

As to the connection between req.set_content_length() and how much data
you write, there isn't really any. Calling req.set_content_length()  
only has the
effect of setting the "Content-Length" response header. You could set  
the
content length to a small value and write more data that you say  
there will be
and mod_python/Apache will quite happily let you do it. A remote  
client on
the other handle may well probably discard any extra content if it  
honours the
content length header.

For most people, how many times you call req.write() and whether you use
buffering isn't going to matter one bit. Some may want to minimise  
the number
of calls to req.write() or use buffering for perceived performance  
reasons (right
or wrong).

One valid reason for not having req.write() flush data automatically  
though is
if you are using an output filter that wants to see the whole data in  
one go. An
example is the "CONTENT_LENGTH" filter. If you had configured your  
handler
output to go through this filter, you could just say:

def handler(req):
     data = 'No chunking involved.' * 1024
     req.write(data,0)
     req.write(data,0)
     ....
     return apache.OK

and the output filter would add the content length header for you  
automatically.
For this to work, you have to ensure that flush isn't called  
explicitly or implicitly.

What are the underlying concerns that make you think you need to  
understand
this better?

Graham



More information about the Mod_python mailing list