]> git.ipfire.org Git - thirdparty/squid.git/blobdiff - src/adaptation/Initiate.cc
Source Format Enforcement (#532)
[thirdparty/squid.git] / src / adaptation / Initiate.cc
index 7a0c3594ae337e60b7091bd832bb8e3b2e1bc8a5..cbb0258cf77eecebceac3da4a67e5847e73bd9cb 100644 (file)
@@ -1,13 +1,43 @@
 /*
- * DEBUG: section 93    ICAP (RFC 3507) Client
+ * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
  */
 
+/* DEBUG: section 93    ICAP (RFC 3507) Client */
+
 #include "squid.h"
-#include "HttpMsg.h"
-#include "adaptation/Initiator.h"
+#include "adaptation/Answer.h"
 #include "adaptation/Initiate.h"
+#include "adaptation/Initiator.h"
 #include "base/AsyncJobCalls.h"
+#include "http/Message.h"
+
+namespace Adaptation
+{
+typedef UnaryMemFunT<Initiator, Answer, const Answer &> AnswerDialer;
+/// Calls expectNoConsumption() if noteAdaptationAnswer async call is
+/// scheduled but never fired (e.g., because the HTTP transaction aborts).
+class AnswerCall: public AsyncCallT<AnswerDialer>
+{
+public:
+    AnswerCall(const char *aName, const AnswerDialer &aDialer) :
+        AsyncCallT<AnswerDialer>(93, 5, aName, aDialer), fired(false) {}
+    virtual void fire() {
+        fired = true;
+        AsyncCallT<AnswerDialer>::fire();
+    }
+    virtual ~AnswerCall() {
+        if (!fired && dialer.arg1.message != NULL && dialer.arg1.message->body_pipe != NULL)
+            dialer.arg1.message->body_pipe->expectNoConsumption();
+    }
 
+private:
+    bool fired; ///< whether we fired the call
+};
+}
 
 Adaptation::Initiate::Initiate(const char *aTypeName): AsyncJob(aTypeName)
 {
@@ -28,7 +58,6 @@ Adaptation::Initiate::initiator(const CbcPointer<Initiator> &i)
     theInitiator = i;
 }
 
-
 // internal cleanup
 void Adaptation::Initiate::swanSong()
 {
@@ -49,13 +78,12 @@ void Adaptation::Initiate::clearInitiator()
 
 void Adaptation::Initiate::sendAnswer(const Answer &answer)
 {
-    typedef UnaryMemFunT<Initiator, Answer, const Answer &> MyDialer;
-    CallJob(93, 5, __FILE__, __LINE__, "Initiator::noteAdaptationAnswer",
-            MyDialer(theInitiator, &Initiator::noteAdaptationAnswer, answer));
+    AsyncCall::Pointer call = new AnswerCall("Initiator::noteAdaptationAnswer",
+            AnswerDialer(theInitiator, &Initiator::noteAdaptationAnswer, answer));
+    ScheduleCallHere(call);
     clearInitiator();
 }
 
-
 void Adaptation::Initiate::tellQueryAborted(bool final)
 {
     sendAnswer(Answer::Error(final));
@@ -65,3 +93,4 @@ const char *Adaptation::Initiate::status() const
 {
     return AsyncJob::status(); // for now
 }
+