]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/Initiate.cc
2 * Copyright (C) 1996-2022 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 93 ICAP (RFC 3507) Client */
12 #include "adaptation/Answer.h"
13 #include "adaptation/Initiate.h"
14 #include "adaptation/Initiator.h"
15 #include "base/AsyncJobCalls.h"
16 #include "http/Message.h"
20 typedef UnaryMemFunT
<Initiator
, Answer
, const Answer
&> AnswerDialer
;
21 /// Calls expectNoConsumption() if noteAdaptationAnswer async call is
22 /// scheduled but never fired (e.g., because the HTTP transaction aborts).
23 class AnswerCall
: public AsyncCallT
<AnswerDialer
>
26 AnswerCall(const char *aName
, const AnswerDialer
&aDialer
) :
27 AsyncCallT
<AnswerDialer
>(93, 5, aName
, aDialer
), fired(false) {}
30 AsyncCallT
<AnswerDialer
>::fire();
32 virtual ~AnswerCall() {
33 if (!fired
&& dialer
.arg1
.message
!= nullptr && dialer
.arg1
.message
->body_pipe
!= nullptr)
34 dialer
.arg1
.message
->body_pipe
->expectNoConsumption();
38 bool fired
; ///< whether we fired the call
42 Adaptation::Initiate::Initiate(const char *aTypeName
): AsyncJob(aTypeName
)
46 Adaptation::Initiate::~Initiate()
48 // TODO: we cannot assert(!theInitiator) because that fails if a child
49 // constructor fails. AsyncJob should have wasStarted flag so that we
50 // can assert(!(wasStarted && theInitiator)).
54 Adaptation::Initiate::initiator(const CbcPointer
<Initiator
> &i
)
62 void Adaptation::Initiate::swanSong()
64 debugs(93, 5, "swan sings" << status());
66 if (theInitiator
.set()) {
67 debugs(93, 3, "fatal failure; sending abort notification");
68 tellQueryAborted(true); // final by default
71 debugs(93, 5, "swan sang" << status());
74 void Adaptation::Initiate::clearInitiator()
79 void Adaptation::Initiate::sendAnswer(const Answer
&answer
)
81 AsyncCall::Pointer call
= new AnswerCall("Initiator::noteAdaptationAnswer",
82 AnswerDialer(theInitiator
, &Initiator::noteAdaptationAnswer
, answer
));
83 ScheduleCallHere(call
);
87 void Adaptation::Initiate::tellQueryAborted(bool final
)
89 sendAnswer(Answer::Error(final
));
92 const char *Adaptation::Initiate::status() const
94 return AsyncJob::status(); // for now