diff -wubir squid-3.2.1//src/adaptation/icap/Xaction.cc squid-3.2.1//src/adaptation/icap/Xaction.cc --- squid-3.2.1//src/adaptation/icap/Xaction.cc 2012-08-15 07:24:19.000000000 +0400 +++ squid-3.2.1//src/adaptation/icap/Xaction.cc 2012-08-27 12:01:38.822888615 +0400 @@ -42,7 +42,8 @@ ignoreLastWrite(false), connector(NULL), reader(NULL), writer(NULL), closer(NULL), alep(new AccessLogEntry), - al(*alep) + al(*alep), + cs(NULL) { debugs(93,3, typeName << " constructed, this=" << this << " [icapx" << id << ']'); // we should not call virtual status() here @@ -166,8 +167,8 @@ // TODO: service bypass status may differ from that of a transaction typedef CommCbMemFunT ConnectDialer; connector = JobCallback(93,3, ConnectDialer, this, Adaptation::Icap::Xaction::noteCommConnected); - Comm::ConnOpener *cs = new Comm::ConnOpener(connection, connector, TheConfig.connect_timeout(service().cfg().bypass)); + cs = new Comm::ConnOpener(connection, connector, TheConfig.connect_timeout(service().cfg().bypass)); cs->setHost(s.cfg().host.termedBuf()); AsyncJob::Start(cs); } @@ -222,6 +223,8 @@ // connection with the ICAP service established void Adaptation::Icap::Xaction::noteCommConnected(const CommConnectCbParams &io) { + cs = NULL; + if (io.flag == COMM_TIMEOUT) { handleCommTimedout(); return; @@ -506,6 +509,12 @@ void Adaptation::Icap::Xaction::swanSong() { // kids should sing first and then call the parent method. + if (cs) + { + debugs(93,6, HERE << id << " about to notify ConnOpener!"); + CallJobHere(93, 3, cs, Comm::ConnOpener, noteAbort); + cs = NULL; + } closeConnection(); // TODO: rename because we do not always close diff -wubir squid-3.2.1//src/adaptation/icap/Xaction.h squid-3.2.1//src/adaptation/icap/Xaction.h --- squid-3.2.1//src/adaptation/icap/Xaction.h 2012-08-15 07:24:19.000000000 +0400 +++ squid-3.2.1//src/adaptation/icap/Xaction.h 2012-08-24 18:18:31.998889205 +0400 @@ -42,6 +42,7 @@ #include "AccessLogEntry.h" #include "HttpReply.h" #include "ipcache.h" +#include "comm/ConnOpener.h" class CommConnectCbParams; @@ -188,6 +189,7 @@ timeval icap_tio_finish; /*time when the last byte of the ICAP responsewas received*/ private: + Comm::ConnOpener *cs; //CBDATA_CLASS2(Xaction); }; diff -wubir squid-3.2.1//src/comm/ConnOpener.h squid-3.2.1//src/comm/ConnOpener.h --- squid-3.2.1//src/comm/ConnOpener.h 2012-08-15 07:24:19.000000000 +0400 +++ squid-3.2.1//src/comm/ConnOpener.h 2012-08-27 11:51:24.694908049 +0400 @@ -21,6 +21,8 @@ virtual void swanSong(); public: + void noteAbort() { mustStop("externally aborted"); } + typedef CbcPointer Pointer; virtual bool doneAll() const;