]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug #2975 fix: chunked requests not supported after regular ones
authorAlex Rousskov <rousskov@measurement-factory.com>
Fri, 30 Jul 2010 20:11:20 +0000 (14:11 -0600)
committerAlex Rousskov <rousskov@measurement-factory.com>
Fri, 30 Jul 2010 20:11:20 +0000 (14:11 -0600)
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
src/client_side.h

index 87114a5d5a928a457a7314aee6df2e5286e5c5ad..e7dd33f98dc54577cb59fafba6c068eeb9f6ce5e 100644 (file)
@@ -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;
 }
 
index c3b363d5f9d3c30b766052f29d5a8611f0e08394..2bf02c52f098eae92731e8ef83d0277ffb559b07 100644 (file)
@@ -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);