]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/Server.cc
Merge from trunk. plus some polish
[thirdparty/squid.git] / src / Server.cc
index 9af6116dd1424489c57133376580d444c13c426c..40d45f8b8716a63851a839351f0721a3d5f02da9 100644 (file)
 extern void purgeEntriesByUrl(HttpRequest * req, const char *url);
 
 
-ServerStateData::ServerStateData(FwdState *theFwdState): AsyncJob("ServerStateData"),requestSender(NULL)
+ServerStateData::ServerStateData(FwdState *theFwdState): AsyncJob("ServerStateData"),
+        requestSender(NULL),
 #if USE_ADAPTATION
-        , adaptedHeadSource(NULL)
-        , adaptationAccessCheckPending(false)
-        , startedAdaptation(false)
+        adaptedHeadSource(NULL),
+        adaptationAccessCheckPending(false),
+        startedAdaptation(false),
 #endif
+        receivedWholeRequestBody(false)
 {
     fwd = theFwdState;
     entry = fwd->entry;
@@ -322,6 +324,7 @@ ServerStateData::handleMoreRequestBodyAvailable()
 void
 ServerStateData::handleRequestBodyProductionEnded()
 {
+    receivedWholeRequestBody = true;
     if (!requestSender)
         doneSendingRequestBody();
     else
@@ -390,10 +393,12 @@ ServerStateData::sentRequestBody(const CommIoCbParams &io)
         return;
     }
 
-    if (requestBodySource->exhausted())
+    if (!requestBodySource->exhausted())
+        sendMoreRequestBody();
+    else if (receivedWholeRequestBody)
         doneSendingRequestBody();
     else
-        sendMoreRequestBody();
+        debugs(9,3, HERE << "waiting for body production end or abort");
 }
 
 #if 0
@@ -418,7 +423,7 @@ ServerStateData::sendMoreRequestBody()
     }
 
     MemBuf buf;
-    if (requestBodySource->getMoreData(buf)) {
+    if (getMoreRequestBody(buf) && buf.contentSize() > 0) {
         debugs(9,3, HERE << "will write " << buf.contentSize() << " request body bytes");
         typedef CommCbMemFunT<ServerStateData, CommIoCbParams> Dialer;
         requestSender = JobCallback(93,3,
@@ -430,6 +435,15 @@ ServerStateData::sendMoreRequestBody()
     }
 }
 
+/// either fill buf with available [encoded] request body bytes or return false
+bool
+ServerStateData::getMoreRequestBody(MemBuf &buf)
+{
+    // default implementation does not encode request body content
+    Must(requestBodySource != NULL);
+    return requestBodySource->getMoreData(buf);
+}
+
 // Compares hosts in urls, returns false if different, no sheme, or no host.
 static bool
 sameUrlHosts(const char *url1, const char *url2)