}
}
- if (!error && splice)
- switchToTunnel(request.getRaw(), clientConn, serverConn);
+ if (!error) {
+ serverCertificateVerified();
+ if (splice)
+ switchToTunnel(request.getRaw(), clientConn, serverConn);
+ }
}
void
serverCertificateHandled = true;
- csd->resetSslCommonName(Ssl::CommonHostName(serverCert.get()));
- debugs(83, 5, "HTTPS server CN: " << csd->sslCommonName() <<
- " bumped: " << *serverConnection());
-
// remember the server certificate for later use
if (Ssl::ServerBump *serverBump = csd->serverBump()) {
serverBump->serverCert.reset(serverCert.release());
}
}
+void
+Ssl::PeekingPeerConnector::serverCertificateVerified()
+{
+ if (ConnStateData *csd = request->clientConnectionManager.valid()) {
+ Ssl::X509_Pointer serverCert;
+ if(Ssl::ServerBump *serverBump = csd->serverBump())
+ serverCert.resetAndLock(serverBump->serverCert.get());
+ else {
+ const int fd = serverConnection()->fd;
+ SSL *ssl = fd_table[fd].ssl;
+ serverCert.reset(SSL_get_peer_certificate(ssl));
+ }
+ if (serverCert.get()) {
+ csd->resetSslCommonName(Ssl::CommonHostName(serverCert.get()));
+ debugs(83, 5, "HTTPS server CN: " << csd->sslCommonName() <<
+ " bumped: " << *serverConnection());
+ }
+ }
+}
+
+
/// Handles the final bumping decision.
void checkForPeekAndSpliceDone(Ssl::BumpMode const);
+ /// Runs after the server certificate verified to update client
+ /// connection manager members
+ void serverCertificateVerified();
+
/// A wrapper function for checkForPeekAndSpliceDone for use with acl
static void cbCheckForPeekAndSpliceDone(allow_t answer, void *data);