From: Amos Jeffries Date: Sun, 1 Aug 2010 12:51:27 +0000 (-0600) Subject: Author: Alex Rousskov X-Git-Tag: SQUID_3_2_0_1~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2bee138497670896b64f4ae64a01f68977a3029a;p=thirdparty%2Fsquid.git Author: Alex Rousskov Bug 2975: chunked requests not supported after regular ones Clean dechunking state to avoid a 501 response to a chunked request following a non-chunked request on a persistent connection. --- diff --git a/src/client_side.cc b/src/client_side.cc index 87114a5d5a..e7dd33f98d 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -2495,7 +2495,8 @@ clientProcessRequest(ConnStateData *conn, HttpParser *hp, ClientSocketContext *c request->setContentLength(conn->in.dechunked.contentSize()); request->header.delById(HDR_TRANSFER_ENCODING); conn->finishDechunkingRequest(hp); - } + } else + conn->cleanDechunkingRequest(); unsupportedTe = tePresent && !deChunked; if (!urlCheckRequest(request) || unsupportedTe) { @@ -3754,9 +3755,6 @@ ConnStateData::finishDechunkingRequest(HttpParser *hp) debugs(33, 5, HERE << "finish dechunking; content: " << in.dechunked.contentSize()); assert(in.dechunkingState == chunkReady); - assert(in.bodyParser); - delete in.bodyParser; - in.bodyParser = NULL; const mb_size_t headerSize = HttpParserRequestLen(hp); @@ -3778,8 +3776,19 @@ ConnStateData::finishDechunkingRequest(HttpParser *hp) in.notYetUsed = end - in.buf; - in.chunked.clean(); - in.dechunked.clean(); + cleanDechunkingRequest(); +} + +/// cleanup dechunking state, get ready for the next request +void +ConnStateData::cleanDechunkingRequest() +{ + if (in.dechunkingState > chunkNone) { + delete in.bodyParser; + in.bodyParser = NULL; + in.chunked.clean(); + in.dechunked.clean(); + } in.dechunkingState = chunkUnknown; } diff --git a/src/client_side.h b/src/client_side.h index c3b363d5f9..2bf02c52f0 100644 --- a/src/client_side.h +++ b/src/client_side.h @@ -269,6 +269,7 @@ public: void startDechunkingRequest(HttpParser *hp); bool parseRequestChunks(HttpParser *hp); void finishDechunkingRequest(HttpParser *hp); + void cleanDechunkingRequest(); private: int connReadWasError(comm_err_t flag, int size, int xerrno);