return n;
}
-void AsyncSSLSocket::sslInfoCallback(const SSL* ssl, int where, int /* ret */) {
+void AsyncSSLSocket::sslInfoCallback(const SSL* ssl, int where, int ret) {
AsyncSSLSocket *sslSocket = AsyncSSLSocket::getFromSSL(ssl);
if (sslSocket->handshakeComplete_ && (where & SSL_CB_HANDSHAKE_START)) {
sslSocket->renegotiateAttempted_ = true;
}
+ if (where & SSL_CB_READ_ALERT) {
+ const char* type = SSL_alert_type_string(ret);
+ if (type) {
+ const char* desc = SSL_alert_desc_string(ret);
+ sslSocket->alertsReceived_.emplace_back(
+ *type, StringPiece(desc, std::strlen(desc)));
+ }
+ }
}
int AsyncSSLSocket::eorAwareBioWrite(BIO *b, const char *in, int inl) {
return sigAlgs;
}
+ std::string getSSLAlertsReceived() const {
+ std::string ret;
+
+ for (const auto& alert : alertsReceived_) {
+ if (!ret.empty()) {
+ ret.append(",");
+ }
+ ret.append(folly::to<std::string>(alert.first, ": ", alert.second));
+ }
+
+ return ret;
+ }
+
/**
* Get the list of shared ciphers between the server and the client.
* Works well for only SSLv2, not so good for SSLv3 or TLSv1.
bool cacheAddrOnFailure_{false};
bool bufferMovableEnabled_{false};
std::unique_ptr<ssl::ClientHelloInfo> clientHelloInfo_;
+ std::vector<std::pair<char, StringPiece>> alertsReceived_;
// Time taken to complete the ssl handshake.
std::chrono::steady_clock::time_point handshakeStartTime_;