diff --git a/src/HttpServer.cc b/src/HttpServer.cc index cc92dfb6..f40d2775 100644 --- a/src/HttpServer.cc +++ b/src/HttpServer.cc @@ -471,6 +471,8 @@ int Http2Handler::write_clear() { int Http2Handler::tls_handshake() { ev_io_stop(sessions_->get_loop(), &wev_); + ERR_clear_error(); + auto rv = SSL_do_handshake(ssl_); if (rv == 0) { @@ -511,6 +513,8 @@ int Http2Handler::tls_handshake() { int Http2Handler::read_tls() { uint8_t buf[8192]; + ERR_clear_error(); + for (;;) { auto rv = SSL_read(ssl_, buf, sizeof(buf)); @@ -524,8 +528,8 @@ int Http2Handler::read_tls() { case SSL_ERROR_WANT_READ: goto fin; case SSL_ERROR_WANT_WRITE: - ev_io_start(sessions_->get_loop(), &wev_); - goto fin; + // renegotiation started + return -1; default: return -1; } @@ -546,6 +550,9 @@ fin: int Http2Handler::write_tls() { auto loop = sessions_->get_loop(); + + ERR_clear_error(); + for (;;) { if (wb_.rleft() > 0) { const void *p; @@ -562,8 +569,8 @@ int Http2Handler::write_tls() { auto err = SSL_get_error(ssl_, rv); switch (err) { case SSL_ERROR_WANT_READ: - ev_io_stop(loop, &wev_); - return 0; + // renegotiation started + return -1; case SSL_ERROR_WANT_WRITE: ev_io_start(sessions_->get_loop(), &wev_); return 0; diff --git a/src/h2load.cc b/src/h2load.cc index 66fd854c..143f96a8 100644 --- a/src/h2load.cc +++ b/src/h2load.cc @@ -567,6 +567,8 @@ int Client::connected() { } int Client::tls_handshake() { + ERR_clear_error(); + auto rv = SSL_do_handshake(ssl); if (rv == 0) { @@ -601,6 +603,9 @@ int Client::tls_handshake() { int Client::read_tls() { uint8_t buf[8192]; + + ERR_clear_error(); + for (;;) { auto rv = SSL_read(ssl, buf, sizeof(buf)); @@ -614,8 +619,8 @@ int Client::read_tls() { case SSL_ERROR_WANT_READ: return 0; case SSL_ERROR_WANT_WRITE: - ev_io_start(worker->loop, &wev); - return 0; + // renegotiation started + return -1; default: return -1; } @@ -628,6 +633,8 @@ int Client::read_tls() { } int Client::write_tls() { + ERR_clear_error(); + for (;;) { if (wb.rleft() > 0) { const void *p; @@ -644,8 +651,8 @@ int Client::write_tls() { auto err = SSL_get_error(ssl, rv); switch (err) { case SSL_ERROR_WANT_READ: - ev_io_stop(worker->loop, &wev); - return 0; + // renegotiation started + return -1; case SSL_ERROR_WANT_WRITE: ev_io_start(worker->loop, &wev); return 0; diff --git a/src/nghttp.cc b/src/nghttp.cc index d55a27ca..5d2481ed 100644 --- a/src/nghttp.cc +++ b/src/nghttp.cc @@ -1123,6 +1123,8 @@ struct HttpClient { int tls_handshake() { ev_timer_again(loop, &rt); + ERR_clear_error(); + auto rv = SSL_do_handshake(ssl); if (rv == 0) { @@ -1161,6 +1163,8 @@ struct HttpClient { int read_tls() { ev_timer_again(loop, &rt); + ERR_clear_error(); + uint8_t buf[8192]; for (;;) { auto rv = SSL_read(ssl, buf, sizeof(buf)); @@ -1175,9 +1179,8 @@ struct HttpClient { case SSL_ERROR_WANT_READ: return 0; case SSL_ERROR_WANT_WRITE: - ev_io_start(loop, &wev); - ev_timer_again(loop, &wt); - return 0; + // renegotiation started + return -1; default: return -1; } @@ -1192,6 +1195,8 @@ struct HttpClient { int write_tls() { ev_timer_again(loop, &rt); + ERR_clear_error(); + for (;;) { if (wb.rleft() > 0) { const void *p; @@ -1208,9 +1213,8 @@ struct HttpClient { auto err = SSL_get_error(ssl, rv); switch (err) { case SSL_ERROR_WANT_READ: - ev_io_stop(loop, &wev); - ev_timer_stop(loop, &wt); - return 0; + // renegotiation started + return -1; case SSL_ERROR_WANT_WRITE: ev_io_start(loop, &wev); ev_timer_again(loop, &wt);