From 7bf032257f6f2f16e415be669d6b6d54a8dabc6e Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Sun, 1 Aug 2010 07:32:36 -0600 Subject: [PATCH] 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. --- src/client_side.cc | 21 +++++++++++++++------ src/client_side.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) 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); -- 2.47.3