4 * DEBUG: section 16 Cache Manager API
9 #include "base/AsyncJobCalls.h"
10 #include "base/TextException.h"
11 #include "CommCalls.h"
12 #include "comm/Connection.h"
13 #include "errorpage.h"
15 #include "HttpReply.h"
16 #include "HttpRequest.h"
18 #include "mgr/Forwarder.h"
19 #include "mgr/Request.h"
20 #include "SquidTime.h"
24 CBDATA_NAMESPACED_CLASS_INIT(Mgr
, Forwarder
);
27 Mgr::Forwarder::Forwarder(const Comm::ConnectionPointer
&aConn
, const ActionParams
&aParams
,
28 HttpRequest
* aRequest
, StoreEntry
* anEntry
):
29 Ipc::Forwarder(new Request(KidIdentifier
, 0, aConn
, aParams
), 10),
30 httpRequest(aRequest
), entry(anEntry
), conn(aConn
)
32 debugs(16, 5, HERE
<< conn
);
33 Must(Comm::IsConnOpen(conn
));
34 Must(httpRequest
!= NULL
);
37 HTTPMSGLOCK(httpRequest
);
39 EBIT_SET(entry
->flags
, ENTRY_FWD_HDR_WAIT
);
41 closer
= asyncCall(16, 5, "Mgr::Forwarder::noteCommClosed",
42 CommCbMemFunT
<Forwarder
, CommCloseCbParams
>(this, &Forwarder::noteCommClosed
));
43 comm_add_close_handler(conn
->fd
, closer
);
46 Mgr::Forwarder::~Forwarder()
49 Must(httpRequest
!= NULL
);
52 HTTPMSGUNLOCK(httpRequest
);
53 entry
->unregisterAbort();
58 /// closes our copy of the client HTTP connection socket
60 Mgr::Forwarder::cleanup()
62 if (Comm::IsConnOpen(conn
)) {
64 comm_remove_close_handler(conn
->fd
, closer
);
73 Mgr::Forwarder::handleError()
75 debugs(16, DBG_CRITICAL
, "ERROR: uri " << entry
->url() << " exceeds buffer size");
76 sendError(new ErrorState(ERR_INVALID_URL
, HTTP_REQUEST_URI_TOO_LARGE
, httpRequest
));
81 Mgr::Forwarder::handleTimeout()
83 sendError(new ErrorState(ERR_LIFETIME_EXP
, HTTP_REQUEST_TIMEOUT
, httpRequest
));
84 Ipc::Forwarder::handleTimeout();
88 Mgr::Forwarder::handleException(const std::exception
& e
)
90 if (entry
!= NULL
&& httpRequest
!= NULL
&& Comm::IsConnOpen(conn
))
91 sendError(new ErrorState(ERR_INVALID_RESP
, HTTP_INTERNAL_SERVER_ERROR
, httpRequest
));
92 Ipc::Forwarder::handleException(e
);
95 /// called when the client socket gets closed by some external force
97 Mgr::Forwarder::noteCommClosed(const CommCloseCbParams
& params
)
100 conn
= NULL
; // needed?
101 mustStop("commClosed");
104 /// called when Coordinator starts processing the request
106 Mgr::Forwarder::handleRemoteAck()
108 Ipc::Forwarder::handleRemoteAck();
111 EBIT_CLR(entry
->flags
, ENTRY_FWD_HDR_WAIT
);
117 Mgr::Forwarder::sendError(ErrorState
*error
)
122 Must(httpRequest
!= NULL
);
124 EBIT_CLR(entry
->flags
, ENTRY_FWD_HDR_WAIT
);
126 entry
->replaceHttpReply(error
->BuildHttpReply());
127 entry
->expires
= squid_curtime
;