Edit report at http://bugs.php.net/bug.php?id=44164&edit=1

 ID:                 44164
 Updated by:         cataphr...@php.net
 Reported by:        mplomer at gmx dot de
-Summary:            Handle "Content-Length" HTTP header when
                     zlib.output_compression active
+Summary:            Crash when using unserialized DatePeriod instance
 Status:             Assigned
-Type:               Feature/Change Request
+Type:               Bug
-Package:            *General Issues
+Package:            Date/time related
-Operating System:   *
+Operating System:   Windows XP SP3
-PHP Version:        5.2.5
+PHP Version:        5.3.3
 Assigned To:        cataphract
 Block user comment: N
 Private report:     N

 New Comment:

> Our projects make heavy use of Content-Length. Disabling it
unnecessarily is

> costly on networks with large RTT.



The problem is not the existence of a Content-length header, it's the
fact that you're setting a content-length header indicating a size you
cannot possibly know. A wrong Content-length header is worse than none.



Apache already adds a Content-length header when it can (i.e. for small
responses), it's not necessary PHP does this; sending it on every
compressed response is unpractical because it would require buffering
the entire response. If you need this, I suppose you can always
explicitly start the zlib output handler and call ob_get_length.


Previous Comments:
------------------------------------------------------------------------
[2010-12-13 17:45:21] panczel dot levente at groware dot hu

Our projects make heavy use of Content-Length. Disabling it
unnecessarily is costly on networks with large RTT.

I also do not agree that manipulating Content-Length is a bad thing to
do for output handlers. To give a correct Content-Length (whenever
possible) is the task of the handler just as setting the
"Content-Encoding: gzip" is.

I'd vote for a solution where zlib output generates a correct
Content-Length whenever it has the opportunity (regarding the current
settings). The most straightforward solution I can imagine is that the
output compression module waits until the first buffer flush and then
right before writing to its output it checks whether the input has
finished [i.e. the whole page is buffered] and that the
compressed+encoded length is known; then it sets the correct
Content-Length. If, but _only_ if any of the above requirements are not
met (input still pending, compressed size is unknown for compression
cannot complete without flushing first) then clear Content-Length and
flush (so it cannot be set anymore).

I think this would maintain correctness, does not need additional
resources (like extra buffering), but keeps the benefits of sending
Content-Length whenever possible. (This last one I find to be a huge
benefit with pages that include many generated CSS-parts or for pages
that dynamically load many files, like dojo.)

------------------------------------------------------------------------
[2010-11-18 05:09:04] cataphr...@php.net

Automatic comment from SVN on behalf of cataphract
Revision: http://svn.php.net/viewvc/?view=revision&revision=305481
Log: - Reversed implementation of FR #44164, pending further
consideration.
  See rev #304903.

------------------------------------------------------------------------
[2010-10-30 18:32:34] cataphr...@php.net

I'm reopening as the general opinion seems to be that the content-length
header should be suppressed instead of disabling compression.

------------------------------------------------------------------------
[2010-10-26 04:16:23] cataphr...@php.net

Automatic comment from SVN on behalf of cataphract
Revision: http://svn.php.net/viewvc/?view=revision&revision=304903
Log: - Implemented request #44164, zlib.output_compression is now
implicitly
  disabled when the header "Content-length" is set.
#One could argue that any output handler could change the size of the
#response, so this exception for zlib.output_compression is an
#inconsistency. However, zlib.output_compression is presented as a
#performance setting, whose value should have no effect on the
#correctness of the scripts. This was not the case. Setting the
#header "content-length" and enabling zlib.output_compression
was
#a recipe for infringing section 4.4 of RFC 2616.

------------------------------------------------------------------------
[2010-10-23 16:49:53] mplomer at gmx dot de

In the meantime we do output-compression only via apache. But back to
the problem:



First I thought it would be better to remove the header if present
(buffering output is not an option of course), but it is also an idea to
disable output compression completely, when this header is set (which is
a rare case in our environment, and INHO most php users, too).



Our problem was that Varnish Reverse Proxy was confused by this
inconsistent headers. Both solutions would solve this.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    http://bugs.php.net/bug.php?id=44164


-- 
Edit this bug report at http://bugs.php.net/bug.php?id=44164&edit=1

Reply via email to