@@ -5737,22 +5737,7 @@ inline SSLSocketStream::SSLSocketStream(socket_t sock, SSL *ssl,
57375737 read_timeout_usec_(read_timeout_usec),
57385738 write_timeout_sec_(write_timeout_sec),
57395739 write_timeout_usec_(write_timeout_usec) {
5740- {
5741- timeval tv;
5742- tv.tv_sec = static_cast <long >(read_timeout_sec);
5743- tv.tv_usec = static_cast <decltype (tv.tv_usec )>(read_timeout_usec);
5744-
5745- setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast <char *>(&tv),
5746- sizeof (tv));
5747- }
5748- {
5749- timeval tv;
5750- tv.tv_sec = static_cast <long >(write_timeout_sec);
5751- tv.tv_usec = static_cast <decltype (tv.tv_usec )>(write_timeout_usec);
5752-
5753- setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast <char *>(&tv),
5754- sizeof (tv));
5755- }
5740+ SSL_clear_mode (ssl, SSL_MODE_AUTO_RETRY);
57565741}
57575742
57585743inline SSLSocketStream::~SSLSocketStream () {}
@@ -5767,8 +5752,27 @@ inline bool SSLSocketStream::is_writable() const {
57675752}
57685753
57695754inline ssize_t SSLSocketStream::read (char *ptr, size_t size) {
5770- if (SSL_pending (ssl_) > 0 || is_readable () ) {
5755+ if (SSL_pending (ssl_) > 0 ) {
57715756 return SSL_read (ssl_, ptr, static_cast <int >(size));
5757+ } else if (is_readable ()) {
5758+ auto ret = SSL_read (ssl_, ptr, static_cast <int >(size));
5759+ if (ret < 0 ) {
5760+ auto err = SSL_get_error (ssl_, ret);
5761+ while (err == SSL_ERROR_WANT_READ) {
5762+ if (SSL_pending (ssl_) > 0 ) {
5763+ return SSL_read (ssl_, ptr, static_cast <int >(size));
5764+ } else if (is_readable ()) {
5765+ ret = SSL_read (ssl_, ptr, static_cast <int >(size));
5766+ if (ret >= 0 ) {
5767+ return ret;
5768+ }
5769+ err = SSL_get_error (ssl_, ret);
5770+ } else {
5771+ return -1 ;
5772+ }
5773+ }
5774+ }
5775+ return ret;
57725776 }
57735777 return -1 ;
57745778}
0 commit comments