<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>RE: [Web-SIG] WSGI 2</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>James Bennett wrote:<BR>
&gt; On Tue, Aug 4, 2009 at 11:54 AM, James Y Knight&lt;foom@fuhm.net&gt; wrote:<BR>
&gt;&gt; But that works just fine today. Your WSGI app sends streaming data back<BR>
&gt;&gt; using the iterator functionality, and the server automatically turns it into<BR>
&gt;&gt; chunks if it's talking to an HTTP 1.1 client. What's the problem?<BR>
&gt;<BR>
&gt; No, it doesn't work just fine today. Either the server has to assume<BR>
&gt; that every response from that application should be chunked (which is<BR>
&gt; wrong), or the application needs a way to tell the server to chunk.<BR>
&gt; Turns out HTTP has a way to indicate that, but WSGI outright forbids<BR>
&gt; its use. So instead you have to invent out-of-band mechanisms for the<BR>
&gt; application to tell the server what to do, and in the process reinvent<BR>
&gt; part of HTTP.<BR>
<BR>
It doesn't have to be out of band; CherryPy's wsgiserver will send a response chunked if the application provides no Content-Length response header.<BR>
<BR>
if status == 413:<BR>
&nbsp;&nbsp;&nbsp; # Request Entity Too Large. Close conn to avoid garbage.<BR>
&nbsp;&nbsp;&nbsp; self.close_connection = True<BR>
elif &quot;content-length&quot; not in hkeys:<BR>
&nbsp;&nbsp;&nbsp; # &quot;All 1xx (informational), 204 (no content),<BR>
&nbsp;&nbsp;&nbsp; # and 304 (not modified) responses MUST NOT<BR>
&nbsp;&nbsp;&nbsp; # include a message-body.&quot; So no point chunking.<BR>
&nbsp;&nbsp;&nbsp; if status &lt; 200 or status in (204, 205, 304):<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<BR>
&nbsp;&nbsp;&nbsp; else:<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.response_protocol == 'HTTP/1.1':<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Use the chunked transfer-coding<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.chunked_write = True<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.outheaders.append((&quot;Transfer-Encoding&quot;, &quot;chunked&quot;))<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Closing the conn is the only way to determine len.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.close_connection = True<BR>
<BR>
<BR>
Robert Brewer<BR>
fumanchu@aminus.org</FONT>
</P>

</BODY>
</HTML>