Creating HTTP Results
=====================

This document describes the state of creating HTTP results for Zope
3.2.  This is different than it was in the past and likely to be
different from how it will be in the future. Please bear with us.

Traditionally in Zope, HTTP results are created by simply returning
strings.  Strings are inspected to deduce their content type, which is
usually HTML.  Applications can override this by setting a response
headers (calling request.response.setHeader).

In Zope 2, applications could also call response.write.  This allows 
both:

- Effecient handling of large output

- HTTP chucked output for streaming

Before release 3.1, Zope 3 has a response write method that did
neither of these things.  Developers coming from Zope 2 might use the
write method, expecting it to have the same bahavior as it does in
Zope 2.  At least until we can satisfy those expectations, we have
disabled the response write method for now.  Maybe we'll reinstate it
in the future.

There is currently no support for streaming, but there is now support
for returning large amounts of data.

Returning large amounts of data without storing the data in memory
------------------------------------------------------------------

To return a large result, you should write the result to a temporary
file (tempfile.TemporaryFile) and return the temporary file.
Alternatively, if the data you want to return is already in a
(non-temporary) file, just open and return that file.  The publisher
(actually an adapter used by the publisher) will handle a returned
file very efficiently.  

The publisher will compute the response content length from the file
automatically. It is up to applications to set the content type.
It will also take care of positioning the file to it's beginning, 
so applications don't need to do this beforehand.

