]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Author: Alex Rousskov <rousskov@measurement-factory.com>
authorAmos Jeffries <amosjeffries@squid-cache.org>
Sun, 1 Aug 2010 13:32:36 +0000 (07:32 -0600)
committerAmos Jeffries <amosjeffries@squid-cache.org>
Sun, 1 Aug 2010 13:32:36 +0000 (07:32 -0600)
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
src/client_side.h

index dc185fea079b5d6a21dab70fe6c49d609305b0fe..04b5bd9f1143c2f2316214781b6178e8b824ed1f 100644 (file)
@@ -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;
 }
 
index 5824b63966a54ab1affe4e98db260e04e450a719..0ec5ce5d5f158166d039f3f5476644154b41a5c0 100644 (file)
@@ -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);