On 24/08/2012 4:30 p.m., Alex Rousskov wrote:
Hello,
When Squid forwards a response with a Content-Range header,
ClientSocketContext::socketState() detects the end of the response
range(s) and returns STREAM_*COMPLETE to
ClientSocketContext::writeComplete(). The latter thinks that the writing
of the response to the client must be over and calls
keepaliveNextRequest() instead of writing the last-chunk (if any). If
the to-client response was chunked, the client gets stuck waiting for
that missing last-chunk.
The multipart Range request case was already excluded from chunking (or
it would probably suffer from the same problem). With this change, no
Content-Range responses will be chunked.
N.B. Some servers send Content-Range responses to basic GET requests
without a Range header, so the problem affects more than just Range
requests.
A proper fix would be to rewrite ClientSocketContext::writeComplete()
and other code so that it does not mix internal ClientStream completion
with [possibly chunk-encoded] writing completion. This should probably
be done along with fixing ClientSocketContext::socketState() and other
state-checking code to ignore to-client persistence
(flags.proxy_keepalive), which is not related to the internal
ClientStream state. Those changes are too big and too potentially
disruptive to be included in this fix though. Patches welcome.
Thank you,
Alex.
+1.
Can you mark that comment in the code with a FIXME or similar please so
we don't loose track of it for later.
Amos