]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/Initiate.cc
2 * DEBUG: section 93 ICAP (RFC 3507) Client
6 #include "adaptation/Answer.h"
7 #include "adaptation/Initiate.h"
8 #include "adaptation/Initiator.h"
9 #include "base/AsyncJobCalls.h"
14 typedef UnaryMemFunT
<Initiator
, Answer
, const Answer
&> AnswerDialer
;
15 /// Calls expectNoConsumption() if noteAdaptationAnswer async call is
16 /// scheduled but never fired (e.g., because the HTTP transaction aborts).
17 class AnswerCall
: public AsyncCallT
<AnswerDialer
>
20 AnswerCall(const char *aName
, const AnswerDialer
&aDialer
) :
21 AsyncCallT
<AnswerDialer
>(93, 5, aName
, aDialer
), fired(false) {}
24 AsyncCallT
<AnswerDialer
>::fire();
26 virtual ~AnswerCall() {
27 if (!fired
&& dialer
.arg1
.message
!= NULL
&& dialer
.arg1
.message
->body_pipe
!= NULL
)
28 dialer
.arg1
.message
->body_pipe
->expectNoConsumption();
32 bool fired
; ///< whether we fired the call
36 Adaptation::Initiate::Initiate(const char *aTypeName
): AsyncJob(aTypeName
)
40 Adaptation::Initiate::~Initiate()
42 // TODO: we cannot assert(!theInitiator) because that fails if a child
43 // constructor fails. AsyncJob should have wasStarted flag so that we
44 // can assert(!(wasStarted && theInitiator)).
48 Adaptation::Initiate::initiator(const CbcPointer
<Initiator
> &i
)
56 void Adaptation::Initiate::swanSong()
58 debugs(93, 5, HERE
<< "swan sings" << status());
60 if (theInitiator
.set()) {
61 debugs(93, 3, HERE
<< "fatal failure; sending abort notification");
62 tellQueryAborted(true); // final by default
65 debugs(93, 5, HERE
<< "swan sang" << status());
68 void Adaptation::Initiate::clearInitiator()
73 void Adaptation::Initiate::sendAnswer(const Answer
&answer
)
75 AsyncCall::Pointer call
= new AnswerCall("Initiator::noteAdaptationAnswer",
76 AnswerDialer(theInitiator
, &Initiator::noteAdaptationAnswer
, answer
));
77 ScheduleCallHere(call
);
81 void Adaptation::Initiate::tellQueryAborted(bool final
)
83 sendAnswer(Answer::Error(final
));
86 const char *Adaptation::Initiate::status() const
88 return AsyncJob::status(); // for now