From: Alex Rousskov Date: Fri, 30 Jul 2010 20:11:20 +0000 (-0600) Subject: Bug #2975 fix: chunked requests not supported after regular ones X-Git-Tag: take1~437 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3bf7bb95782a81685d738fc11618f045e3ac1bd9;p=thirdparty%2Fsquid.git Bug #2975 fix: 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);