@@ -7228,63 +7228,62 @@ inline bool SSLSocketStream::is_writable() const {
7228
7228
}
7229
7229
7230
7230
inline ssize_t SSLSocketStream::read (char *ptr, size_t size) {
7231
- size_t readbytes = 0 ;
7232
7231
if (SSL_pending (ssl_) > 0 ) {
7233
- auto ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7234
- if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7235
- if (SSL_get_error (ssl_, ret) == SSL_ERROR_ZERO_RETURN) { return 0 ; }
7236
- return -1 ;
7237
- }
7238
- if (!is_readable ()) { return -1 ; }
7239
-
7240
- auto ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7241
- if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7242
- auto err = SSL_get_error (ssl_, ret);
7243
- int n = 1000 ;
7232
+ return SSL_read (ssl_, ptr, static_cast <int >(size));
7233
+ } else if (is_readable ()) {
7234
+ auto ret = SSL_read (ssl_, ptr, static_cast <int >(size));
7235
+ if (ret < 0 ) {
7236
+ auto err = SSL_get_error (ssl_, ret);
7237
+ int n = 1000 ;
7244
7238
#ifdef _WIN32
7245
- while (--n >= 0 &&
7246
- (err == SSL_ERROR_WANT_READ ||
7247
- (err == SSL_ERROR_SYSCALL && WSAGetLastError () == WSAETIMEDOUT))) {
7239
+ while (--n >= 0 && (err == SSL_ERROR_WANT_READ ||
7240
+ (err == SSL_ERROR_SYSCALL &&
7241
+ WSAGetLastError () == WSAETIMEDOUT))) {
7248
7242
#else
7249
- while (--n >= 0 && err == SSL_ERROR_WANT_READ) {
7243
+ while (--n >= 0 && err == SSL_ERROR_WANT_READ) {
7250
7244
#endif
7251
- if (SSL_pending (ssl_) > 0 ) {
7252
- ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7253
- if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7254
- if (SSL_get_error (ssl_, ret) == SSL_ERROR_ZERO_RETURN) { return 0 ; }
7255
- return -1 ;
7245
+ if (SSL_pending (ssl_) > 0 ) {
7246
+ return SSL_read (ssl_, ptr, static_cast <int >(size));
7247
+ } else if (is_readable ()) {
7248
+ std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7249
+ ret = SSL_read (ssl_, ptr, static_cast <int >(size));
7250
+ if (ret >= 0 ) { return ret; }
7251
+ err = SSL_get_error (ssl_, ret);
7252
+ } else {
7253
+ return -1 ;
7254
+ }
7255
+ }
7256
7256
}
7257
- if (!is_readable ()) { return -1 ; }
7258
- std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7259
- ret = SSL_read_ex (ssl_, ptr, size, &readbytes);
7260
- if (ret == 1 ) { return static_cast <ssize_t >(readbytes); }
7261
- err = SSL_get_error (ssl_, ret);
7257
+ return ret;
7262
7258
}
7263
- if (err == SSL_ERROR_ZERO_RETURN) { return 0 ; }
7264
7259
return -1 ;
7265
7260
}
7266
7261
7267
7262
inline ssize_t SSLSocketStream::write (const char *ptr, size_t size) {
7268
- if (!is_writable ()) { return -1 ; }
7269
- size_t written = 0 ;
7270
- auto ret = SSL_write_ex (ssl_, ptr, size, &written);
7271
- if (ret == 1 ) { return static_cast <ssize_t >(written); }
7272
- auto err = SSL_get_error (ssl_, ret);
7273
- int n = 1000 ;
7263
+ if (is_writable ()) {
7264
+ auto ret = SSL_write (ssl_, ptr, static_cast <int >(size));
7265
+ if (ret < 0 ) {
7266
+ auto err = SSL_get_error (ssl_, ret);
7267
+ int n = 1000 ;
7274
7268
#ifdef _WIN32
7275
- while (--n >= 0 &&
7276
- (err == SSL_ERROR_WANT_WRITE ||
7277
- (err == SSL_ERROR_SYSCALL && WSAGetLastError () == WSAETIMEDOUT))) {
7269
+ while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE ||
7270
+ (err == SSL_ERROR_SYSCALL &&
7271
+ WSAGetLastError () == WSAETIMEDOUT))) {
7278
7272
#else
7279
- while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
7273
+ while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) {
7280
7274
#endif
7281
- if (!is_writable ()) { return -1 ; }
7282
- std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7283
- ret = SSL_write_ex (ssl_, ptr, size, &written);
7284
- if (ret == 1 ) { return static_cast <ssize_t >(written); }
7285
- err = SSL_get_error (ssl_, ret);
7275
+ if (is_writable ()) {
7276
+ std::this_thread::sleep_for (std::chrono::milliseconds (1 ));
7277
+ ret = SSL_write (ssl_, ptr, static_cast <int >(size));
7278
+ if (ret >= 0 ) { return ret; }
7279
+ err = SSL_get_error (ssl_, ret);
7280
+ } else {
7281
+ return -1 ;
7282
+ }
7283
+ }
7284
+ }
7285
+ return ret;
7286
7286
}
7287
- if (err == SSL_ERROR_ZERO_RETURN) { return 0 ; }
7288
7287
return -1 ;
7289
7288
}
7290
7289
0 commit comments