+/*
+ * Copyright (C) 1996-2017 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.
+ */
+
#include "squid.h"
+#include "AccessLogEntry.h"
#include "base/AsyncJobCalls.h"
#include "base/RunnersRegistry.h"
#include "CachePeer.h"
#include "FwdState.h"
#include "globals.h"
#include "HttpRequest.h"
+#include "MasterXaction.h"
#include "neighbors.h"
#include "pconn.h"
#include "PeerPoolMgr.h"
+#include "security/BlindPeerConnector.h"
#include "SquidConfig.h"
#include "SquidTime.h"
-#if USE_OPENSSL
-#include "ssl/PeerConnector.h"
-#endif
CBDATA_CLASS_INIT(PeerPoolMgr);
-#if USE_OPENSSL
-/// Gives Ssl::PeerConnector access to Answer in the PeerPoolMgr callback dialer.
-class MyAnswerDialer: public UnaryMemFunT<PeerPoolMgr, Ssl::PeerConnectorAnswer, Ssl::PeerConnectorAnswer&>,
- public Ssl::PeerConnector::CbDialer
+/// Gives Security::PeerConnector access to Answer in the PeerPoolMgr callback dialer.
+class MyAnswerDialer: public UnaryMemFunT<PeerPoolMgr, Security::EncryptorAnswer, Security::EncryptorAnswer&>,
+ public Security::PeerConnector::CbDialer
{
public:
MyAnswerDialer(const JobPointer &aJob, Method aMethod):
- UnaryMemFunT<PeerPoolMgr, Ssl::PeerConnectorAnswer, Ssl::PeerConnectorAnswer&>(aJob, aMethod, Ssl::PeerConnectorAnswer()) {}
+ UnaryMemFunT<PeerPoolMgr, Security::EncryptorAnswer, Security::EncryptorAnswer&>(aJob, aMethod, Security::EncryptorAnswer()) {}
- /* Ssl::PeerConnector::CbDialer API */
- virtual Ssl::PeerConnectorAnswer &answer() { return arg1; }
+ /* Security::PeerConnector::CbDialer API */
+ virtual Security::EncryptorAnswer &answer() { return arg1; }
};
-#endif
PeerPoolMgr::PeerPoolMgr(CachePeer *aPeer): AsyncJob("PeerPoolMgr"),
- peer(cbdataReference(aPeer)),
- request(),
- opener(),
- securer(),
- closer(),
- addrUsed(0)
+ peer(cbdataReference(aPeer)),
+ request(),
+ opener(),
+ securer(),
+ closer(),
+ addrUsed(0)
{
}
{
AsyncJob::start();
+ const MasterXaction::Pointer mx = new MasterXaction(XactionInitiator::initPeerPool);
// ErrorState, getOutgoingAddress(), and other APIs may require a request.
// We fake one. TODO: Optionally send this request to peers?
- request = new HttpRequest(Http::METHOD_OPTIONS, AnyP::PROTO_HTTP, "*");
- request->SetHost(peer->host);
+ request = new HttpRequest(Http::METHOD_OPTIONS, AnyP::PROTO_HTTP, "http", "*", mx);
+ request->url.host(peer->host);
checkpoint("peer initialized");
}
Must(params.conn != NULL);
-#if USE_OPENSSL
- // Handle SSL peers.
- if (peer->use_ssl) {
+ // Handle TLS peers.
+ if (peer->secure.encryptTransport) {
typedef CommCbMemFunT<PeerPoolMgr, CommCloseCbParams> CloserDialer;
closer = JobCallback(48, 3, CloserDialer, this,
PeerPoolMgr::handleSecureClosure);
securer = asyncCall(48, 4, "PeerPoolMgr::handleSecuredPeer",
MyAnswerDialer(this, &PeerPoolMgr::handleSecuredPeer));
- const int peerTimeout = peer->connect_timeout > 0 ?
- peer->connect_timeout : Config.Timeout.peer_connect;
+ const int peerTimeout = peerConnectTimeout(peer);
const int timeUsed = squid_curtime - params.conn->startTime();
// Use positive timeout when less than one second is left for conn.
- const int timeLeft = max(1, (peerTimeout - timeUsed));
- Ssl::PeerConnector *connector =
- new Ssl::PeerConnector(request, params.conn, securer, timeLeft);
+ const int timeLeft = positiveTimeout(peerTimeout - timeUsed);
+ auto *connector = new Security::BlindPeerConnector(request, params.conn, securer, nullptr, timeLeft);
AsyncJob::Start(connector); // will call our callback
return;
}
-#endif
pushNewConnection(params.conn);
}
// push() will trigger a checkpoint()
}
-#if USE_OPENSSL
void
-PeerPoolMgr::handleSecuredPeer(Ssl::PeerConnectorAnswer &answer)
+PeerPoolMgr::handleSecuredPeer(Security::EncryptorAnswer &answer)
{
Must(securer != NULL);
securer = NULL;
// allow the closing connection to fully close before we check again
Checkpoint(this, "conn closure while securing");
}
-#endif
void
PeerPoolMgr::openNewConnection()
getOutgoingAddress(request.getRaw(), conn);
GetMarkingsToServer(request.getRaw(), *conn);
- const int ctimeout = peer->connect_timeout > 0 ?
- peer->connect_timeout : Config.Timeout.peer_connect;
+ const int ctimeout = peerConnectTimeout(peer);
typedef CommCbMemFunT<PeerPoolMgr, CommConnectCbParams> Dialer;
opener = JobCallback(48, 5, Dialer, this, PeerPoolMgr::handleOpenedConnection);
Comm::ConnOpener *cs = new Comm::ConnOpener(conn, opener, ctimeout);
}
}
}
+