diff --git a/plugins/http/https.c b/plugins/http/https.c index da4a3deb..9b14e2c2 100644 --- a/plugins/http/https.c +++ b/plugins/http/https.c @@ -294,8 +294,12 @@ ssize_t hr_ssl_write(struct corerouter_peer *main_peer) { } return ret; } - if (ret == 0) return 0; - int err = SSL_get_error(hr->ssl, ret); + int err = 0; + if (ERR_peek_error()) { + err = SSL_get_error(hr->ssl, ret); + } + + if (err == SSL_ERROR_ZERO_RETURN || err == 0) return 0; if (err == SSL_ERROR_WANT_READ) { cr_reset_hooks_and_read(main_peer, hr_ssl_write); @@ -350,8 +354,13 @@ ssize_t hr_ssl_read(struct corerouter_peer *main_peer) { #endif return http_parse(main_peer); } - if (ret == 0) return 0; - int err = SSL_get_error(hr->ssl, ret); + int err = 0; + + if (ERR_peek_error()) { + err = SSL_get_error(hr->ssl, ret); + } + + if (err == SSL_ERROR_ZERO_RETURN || err == 0) return 0; if (err == SSL_ERROR_WANT_READ) { cr_reset_hooks_and_read(main_peer, hr_ssl_read); @@ -382,7 +391,6 @@ ssize_t hr_ssl_shutdown(struct corerouter_peer *peer) { struct http_session *hr = (struct http_session *) cs; int ret = SSL_shutdown(hr->ssl); - if (ret < 0) return -1; if (ret == 1) return 0; int err = 0; @@ -392,7 +400,7 @@ ssize_t hr_ssl_shutdown(struct corerouter_peer *peer) { } // no error, close the connection - if (err == 0 || err == SSL_ERROR_ZERO_RETURN) return -1; + if (err == 0 || err == SSL_ERROR_ZERO_RETURN) return 0; if (err == SSL_ERROR_WANT_READ) { if (uwsgi_cr_set_hooks(peer, hr_ssl_shutdown, NULL)) return -1;