From: Amos Jeffries Date: Sun, 1 Aug 2010 13:32:36 +0000 (-0600) Subject: Author: Alex Rousskov X-Git-Tag: SQUID_3_1_6~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7bf032257f6f2f16e415be669d6b6d54a8dabc6e;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 dc185fea07..04b5bd9f11 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -2425,7 +2425,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) { @@ -3655,9 +3656,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); @@ -3679,8 +3677,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 5824b63966..0ec5ce5d5f 100644 --- a/src/client_side.h +++ b/src/client_side.h @@ -268,6 +268,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);