Source release 14.1.0
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
// Copyright 2018 Google LLC. All Rights Reserved. This file and proprietary
|
||||
// source code may only be used and distributed under the Widevine Master
|
||||
// License Agreement.
|
||||
|
||||
#include "http_socket.h"
|
||||
|
||||
@@ -49,6 +51,18 @@ SSL_CTX* InitSslContext() {
|
||||
return ctx;
|
||||
}
|
||||
|
||||
static int LogBoringSslError(
|
||||
const char* message, size_t length, void* /* user_data */) {
|
||||
LOGE(" BoringSSL Error: %s", message);
|
||||
return length;
|
||||
}
|
||||
|
||||
bool IsRetryableSslError(int ssl_error) {
|
||||
return ssl_error != SSL_ERROR_ZERO_RETURN &&
|
||||
ssl_error != SSL_ERROR_SYSCALL &&
|
||||
ssl_error != SSL_ERROR_SSL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// unused, may be useful for debugging SSL-related issues.
|
||||
void ShowServerCertificate(const SSL* ssl) {
|
||||
@@ -306,22 +320,48 @@ int HttpSocket::Read(char* data, int len, int timeout_in_ms) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
errno = 0; // Reset errno, as we will depend on its value shortly.
|
||||
int read;
|
||||
if (secure_connect_)
|
||||
if (secure_connect_) {
|
||||
read = SSL_read(ssl_, data, to_read);
|
||||
else
|
||||
} else {
|
||||
read = recv(socket_fd_, data, to_read, 0);
|
||||
}
|
||||
|
||||
if (read > 0) {
|
||||
to_read -= read;
|
||||
data += read;
|
||||
total_read += read;
|
||||
} else if (read == 0) {
|
||||
// The connection has been closed. No more data.
|
||||
break;
|
||||
} else if (secure_connect_) {
|
||||
// Secure read error
|
||||
int ssl_error = SSL_get_error(ssl_, read);
|
||||
|
||||
if (ssl_error == SSL_ERROR_ZERO_RETURN ||
|
||||
(ssl_error == SSL_ERROR_SYSCALL && errno == 0)) {
|
||||
// The connection has been closed. No more data.
|
||||
break;
|
||||
} else if (IsRetryableSslError(ssl_error)) {
|
||||
sleep(1);
|
||||
// After sleeping, fall through to iterate the loop again and retry.
|
||||
} else {
|
||||
// Unrecoverable error. Log and abort.
|
||||
LOGE("SSL_read returned %d, LibSSL Error = %d", read, ssl_error);
|
||||
if (ssl_error == SSL_ERROR_SYSCALL) {
|
||||
LOGE(" errno = %d = %s", errno, strerror(errno));
|
||||
}
|
||||
ERR_print_errors_cb(LogBoringSslError, NULL);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
LOGE("recv returned %d, errno = %d = %s", read, errno, strerror(errno));
|
||||
return -1;
|
||||
// Non-secure read error
|
||||
if (read == 0) {
|
||||
// The connection has been closed. No more data.
|
||||
break;
|
||||
} else {
|
||||
// Log the error received
|
||||
LOGE("recv returned %d, errno = %d = %s", read, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user