[nginx] Use EPOLLRDHUP in ngx_http_test_reading() (ticket #320).

Valentin Bartenev vbart at nginx.com
Mon Sep 16 14:34:53 UTC 2013


details:   http://hg.nginx.org/nginx/rev/ef3d094bb6d3
branches:  
changeset: 5374:ef3d094bb6d3
user:      Valentin Bartenev <vbart at nginx.com>
date:      Mon Sep 16 18:33:39 2013 +0400
description:
Use EPOLLRDHUP in ngx_http_test_reading() (ticket #320).

This allows to detect client connection close with pending data when
the ngx_http_test_reading() request event handler is set.

diffstat:

 src/http/ngx_http_request.c |  27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diffs (37 lines):

diff -r 46bdbca10dfc -r ef3d094bb6d3 src/http/ngx_http_request.c
--- a/src/http/ngx_http_request.c	Mon Sep 16 18:33:39 2013 +0400
+++ b/src/http/ngx_http_request.c	Mon Sep 16 18:33:39 2013 +0400
@@ -2694,6 +2694,33 @@ ngx_http_test_reading(ngx_http_request_t
 
 #endif
 
+#if (NGX_HAVE_EPOLLRDHUP)
+
+    if ((ngx_event_flags & NGX_USE_EPOLL_EVENT) && rev->pending_eof) {
+        socklen_t  len;
+
+        rev->eof = 1;
+        c->error = 1;
+
+        err = 0;
+        len = sizeof(ngx_err_t);
+
+        /*
+         * BSDs and Linux return 0 and set a pending error in err
+         * Solaris returns -1 and sets errno
+         */
+
+        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)
+            == -1)
+        {
+            err = ngx_errno;
+        }
+
+        goto closed;
+    }
+
+#endif
+
     n = recv(c->fd, buf, 1, MSG_PEEK);
 
     if (n == 0) {



More information about the nginx-devel mailing list