SSL: reset ready flag if recv(MSG_PEEK) found no bytes in socket. Previously, connection hung after calling ngx_http_ssl_handshake() with rev->ready set and no bytes in socket to read. It's possible in at least the following cases: - when processing a connection with expired TCP_DEFER_ACCEPT on Linux - after parsing PROXY protocol header if it arrived in a separate TCP packet Thanks to James Hamlin.
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index a07d5e4..0ee145d 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c
@@ -652,6 +652,7 @@ if (n == -1) { if (err == NGX_EAGAIN) { + rev->ready = 0; if (!rev->timer_set) { ngx_add_timer(rev, c->listening->post_accept_timeout);