diff --git a/trunk/src/app/srs_app_conn.cpp b/trunk/src/app/srs_app_conn.cpp index c43663179..0717809eb 100644 --- a/trunk/src/app/srs_app_conn.cpp +++ b/trunk/src/app/srs_app_conn.cpp @@ -681,40 +681,46 @@ srs_error_t SrsSslConnection::read(void* plaintext, size_t nn_plaintext, ssize_t { srs_error_t err = srs_success; - ssize_t nn = 0; - int nn_padding = BIO_ctrl_pending(bio_in); - if (nn_padding > 0) { - // Already exists in SSL cache, read it out. - nn = (ssize_t)srs_min(nn_plaintext, nn_padding); - } else { - // TODO: Can we avoid copy? - int nn_cipher = nn_plaintext; - char* cipher = new char[nn_cipher]; - SrsAutoFreeA(char, cipher); + while (true) { + ssize_t nn = 0; + int nn_padding = BIO_ctrl_pending(bio_in); + if (nn_padding > 0) { + // Already exists in SSL cache, read it out. + nn = (ssize_t)srs_min(nn_plaintext, nn_padding); + } else { + // TODO: Can we avoid copy? + int nn_cipher = nn_plaintext; + char* cipher = new char[nn_cipher]; + SrsAutoFreeA(char, cipher); - // Read the cipher from SSL. - if ((err = transport->read(cipher, nn_cipher, &nn)) != srs_success) { - return srs_error_wrap(err, "https: read"); + // Read the cipher from SSL. + if ((err = transport->read(cipher, nn_cipher, &nn)) != srs_success) { + return srs_error_wrap(err, "https: read"); + } + + int r0 = BIO_write(bio_in, cipher, nn); + if (r0 <= 0) { + // TODO: 0 or -1 maybe block, use BIO_should_retry to check. + return srs_error_new(ERROR_HTTPS_READ, "BIO_write r0=%d, cipher=%p, size=%d", r0, cipher, nn); + } } - int r0 = BIO_write(bio_in, cipher, nn); + int r0 = SSL_read(ssl, plaintext, nn); + int r1 = SSL_get_error(ssl, r0); int r2 = BIO_ctrl_pending(bio_in); if (r0 <= 0) { - // TODO: 0 or -1 maybe block, use BIO_should_retry to check. - return srs_error_new(ERROR_HTTPS_READ, "BIO_write r0=%d, cipher=%p, size=%d", r0, cipher, nn); + // We try to read the cached data, but actually there is nothing, so try again. + if (nn_padding > 0 && r2 <= 0) { + continue; + } + return srs_error_new(ERROR_HTTPS_READ, "SSL_read r0=%d, r1=%d, r2=%d, padding=%d, size=%d", + r0, r1, r2, nn_padding, nn); } - } - int r0 = SSL_read(ssl, plaintext, nn); - int r1 = SSL_get_error(ssl, r0); - int r2 = BIO_ctrl_pending(bio_in); - if (r0 <= 0) { - return srs_error_new(ERROR_HTTPS_READ, "SSL_read r0=%d, r1=%d, r2=%d, padding=%d, size=%d", - r0, r1, r2, nn_padding, nn); - } - - srs_assert(r0 <= nn_plaintext); - if (nread) { - *nread = r0; + srs_assert(r0 <= nn_plaintext); + if (nread) { + *nread = r0; + } + break; } return err; diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index 7d11428f5..30c5755d9 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION4_HPP #define SRS_CORE_VERSION4_HPP -#define SRS_VERSION4_REVISION 49 +#define SRS_VERSION4_REVISION 50 #endif