]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Do not chunk responses carrying a Content-Range header.
authorAlex Rousskov <rousskov@measurement-factory.com>
Mon, 10 Sep 2012 22:38:09 +0000 (16:38 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Mon, 10 Sep 2012 22:38:09 +0000 (16:38 -0600)
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.

TODO: 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.

src/client_side_reply.cc

index e1d54b7453fe5a1f6537b26f95538d7d77ac4b62..40ce0875c3713afdd405514ff01faf9975f95fbb 100644 (file)
@@ -1453,7 +1453,11 @@ clientReplyContext::buildReplyHeader()
 
 #endif
 
-    const bool maySendChunkedReply = !request->multipartRangeRequest() &&
+    // XXX: chunking a Content-Range response may not violate specs, but our
+    // ClientSocketContext::writeComplete() confuses the end of ClientStream
+    // with the end of to-client writing and may quit before writing last-chunk
+    const bool maySendChunkedReply = !reply->content_range &&
+                                     !request->multipartRangeRequest() &&
                                      reply->sline.protocol == AnyP::PROTO_HTTP && // response is HTTP
                                      (request->http_ver >= HttpVersion(1, 1));