@@ -7221,62 +7221,63 @@ inline bool SSLSocketStream::is_writable() const {
72217221}
72227222
72237223inline ssize_t SSLSocketStream::read (char *ptr, size_t size) {
7224+ size_t readbytes = 0 ;
72247225 if (SSL_pending (ssl_) > 0 ) {
7225- return SSL_read (ssl_, ptr, static_cast <int >(size));
7226- } else if (is_readable ()) {
7227- auto ret = SSL_read (ssl_, ptr, static_cast <int >(size));
7228- if (ret < 0 ) {
7229- auto err = SSL_get_error (ssl_, ret);
7230- int n = 1000 ;
7226+ auto ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7227+ if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7228+ if (SSL_get_error (ssl_, ret) == SSL_ERROR_ZERO_RETURN) { return 0 ; }
7229+ return -1 ;
7230+ }
7231+ if (!is_readable ()) { return -1 ; }
7232+
7233+ auto ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7234+ if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7235+ auto err = SSL_get_error (ssl_, ret);
7236+ int n = 1000 ;
72317237#ifdef _WIN32
7232- while (--n >= 0 && (err == SSL_ERROR_WANT_READ ||
7233- (err == SSL_ERROR_SYSCALL &&
7234- WSAGetLastError () == WSAETIMEDOUT))) {
7238+ while (--n >= 0 &&
7239+ (err == SSL_ERROR_WANT_READ ||
7240+ (err == SSL_ERROR_SYSCALL && WSAGetLastError () == WSAETIMEDOUT))) {
72357241#else
7236- while (--n >= 0 && err == SSL_ERROR_WANT_READ) {
7242+ while (--n >= 0 && err == SSL_ERROR_WANT_READ) {
72377243#endif
7238- if (SSL_pending (ssl_) > 0 ) {
7239- return SSL_read (ssl_, ptr, static_cast <int >(size));
7240- } else if (is_readable ()) {
7241- std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7242- ret = SSL_read (ssl_, ptr, static_cast <int >(size));
7243- if (ret >= 0 ) { return ret; }
7244- err = SSL_get_error (ssl_, ret);
7245- } else {
7246- return -1 ;
7247- }
7248- }
7244+ if (SSL_pending (ssl_) > 0 ) {
7245+ ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7246+ if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7247+ if (SSL_get_error (ssl_, ret) == SSL_ERROR_ZERO_RETURN) { return 0 ; }
7248+ return -1 ;
72497249 }
7250- return ret;
7250+ if (!is_readable ()) { return -1 ; }
7251+ std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7252+ ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7253+ if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7254+ err = SSL_get_error (ssl_, ret);
72517255 }
7256+ if (err == SSL_ERROR_ZERO_RETURN) { return 0 ; }
72527257 return -1 ;
72537258}
72547259
72557260inline ssize_t SSLSocketStream::write (const char *ptr, size_t size) {
7256- if (is_writable ()) {
7257- auto ret = SSL_write (ssl_, ptr, static_cast <int >(size));
7258- if (ret < 0 ) {
7259- auto err = SSL_get_error (ssl_, ret);
7260- int n = 1000 ;
7261+ if (!is_writable ()) { return -1 ; }
7262+ size_t written = 0 ;
7263+ auto ret = SSL_write_ex (ssl_, ptr, size, &written);
7264+ if (ret == 1 ) { return static_cast <ssize_t >(written); }
7265+ auto err = SSL_get_error (ssl_, ret);
7266+ int n = 1000 ;
72617267#ifdef _WIN32
7262- while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE ||
7263- (err == SSL_ERROR_SYSCALL &&
7264- WSAGetLastError () == WSAETIMEDOUT))) {
7268+ while (--n >= 0 &&
7269+ (err == SSL_ERROR_WANT_WRITE ||
7270+ (err == SSL_ERROR_SYSCALL && WSAGetLastError () == WSAETIMEDOUT))) {
72657271#else
7266- while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
7272+ while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
72677273#endif
7268- if (is_writable ()) {
7269- std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7270- ret = SSL_write (ssl_, ptr, static_cast <int >(size));
7271- if (ret >= 0 ) { return ret; }
7272- err = SSL_get_error (ssl_, ret);
7273- } else {
7274- return -1 ;
7275- }
7276- }
7277- }
7278- return ret;
7274+ if (!is_writable ()) { return -1 ; }
7275+ std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7276+ ret = SSL_write_ex (ssl_, ptr, size, &written);
7277+ if (ret == 1 ) { return static_cast <ssize_t >(written); }
7278+ err = SSL_get_error (ssl_, ret);
72797279 }
7280+ if (err == SSL_ERROR_ZERO_RETURN) { return 0 ; }
72807281 return -1 ;
72817282}
72827283
0 commit comments