From 3bf7bb95782a81685d738fc11618f045e3ac1bd9 Mon Sep 17 00:00:00 2001 From: Alex Rousskov Date: Fri, 30 Jul 2010 14:11:20 -0600 Subject: [PATCH] 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. --- 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 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); -- 2.47.2