mirror of
https://github.com/yhirose/cpp-httplib
synced 2024-11-21 14:29:10 -07:00
Fix #698
This commit is contained in:
parent
109b624dfe
commit
3b29cd0bdc
2 changed files with 23 additions and 17 deletions
38
httplib.h
38
httplib.h
|
@ -5737,22 +5737,7 @@ inline SSLSocketStream::SSLSocketStream(socket_t sock, SSL *ssl,
|
||||||
read_timeout_usec_(read_timeout_usec),
|
read_timeout_usec_(read_timeout_usec),
|
||||||
write_timeout_sec_(write_timeout_sec),
|
write_timeout_sec_(write_timeout_sec),
|
||||||
write_timeout_usec_(write_timeout_usec) {
|
write_timeout_usec_(write_timeout_usec) {
|
||||||
{
|
SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY);
|
||||||
timeval tv;
|
|
||||||
tv.tv_sec = static_cast<long>(read_timeout_sec);
|
|
||||||
tv.tv_usec = static_cast<decltype(tv.tv_usec)>(read_timeout_usec);
|
|
||||||
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char *>(&tv),
|
|
||||||
sizeof(tv));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
timeval tv;
|
|
||||||
tv.tv_sec = static_cast<long>(write_timeout_sec);
|
|
||||||
tv.tv_usec = static_cast<decltype(tv.tv_usec)>(write_timeout_usec);
|
|
||||||
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast<char *>(&tv),
|
|
||||||
sizeof(tv));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline SSLSocketStream::~SSLSocketStream() {}
|
inline SSLSocketStream::~SSLSocketStream() {}
|
||||||
|
@ -5767,8 +5752,27 @@ inline bool SSLSocketStream::is_writable() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
|
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
|
||||||
if (SSL_pending(ssl_) > 0 || is_readable()) {
|
if (SSL_pending(ssl_) > 0) {
|
||||||
return SSL_read(ssl_, ptr, static_cast<int>(size));
|
return SSL_read(ssl_, ptr, static_cast<int>(size));
|
||||||
|
} else if (is_readable()) {
|
||||||
|
auto ret = SSL_read(ssl_, ptr, static_cast<int>(size));
|
||||||
|
if (ret < 0) {
|
||||||
|
auto err = SSL_get_error(ssl_, ret);
|
||||||
|
while (err == SSL_ERROR_WANT_READ) {
|
||||||
|
if (SSL_pending(ssl_) > 0) {
|
||||||
|
return SSL_read(ssl_, ptr, static_cast<int>(size));
|
||||||
|
} else if (is_readable()) {
|
||||||
|
ret = SSL_read(ssl_, ptr, static_cast<int>(size));
|
||||||
|
if (ret >= 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
err = SSL_get_error(ssl_, ret);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3299,6 +3299,7 @@ TEST(SSLClientServerTest, ClientCertPresent) {
|
||||||
t.join();
|
t.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(_WIN32) || defined(OPENSSL_USE_APPLINK)
|
||||||
TEST(SSLClientServerTest, MemoryClientCertPresent) {
|
TEST(SSLClientServerTest, MemoryClientCertPresent) {
|
||||||
X509 *server_cert;
|
X509 *server_cert;
|
||||||
EVP_PKEY *server_private_key;
|
EVP_PKEY *server_private_key;
|
||||||
|
@ -3374,6 +3375,7 @@ TEST(SSLClientServerTest, MemoryClientCertPresent) {
|
||||||
|
|
||||||
t.join();
|
t.join();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST(SSLClientServerTest, ClientCertMissing) {
|
TEST(SSLClientServerTest, ClientCertMissing) {
|
||||||
SSLServer svr(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE, CLIENT_CA_CERT_FILE,
|
SSLServer svr(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE, CLIENT_CA_CERT_FILE,
|
||||||
|
|
Loading…
Reference in a new issue