diff --git a/src/mod_cgi.c b/src/mod_cgi.c index 2a50fd35..47196c94 100644 --- a/src/mod_cgi.c +++ b/src/mod_cgi.c @@ -426,7 +426,6 @@ static int cgi_demux_response(server *srv, handler_ctx *hctx) { if (-1 == (n = read(hctx->fd, hctx->response->ptr, hctx->response->size - 1))) { if (errno == EAGAIN || errno == EINTR) { /* would block, wait for signal */ - fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); return FDEVENT_HANDLED_NOT_FINISHED; } /* error */ @@ -1486,9 +1485,10 @@ SUBREQUEST_FUNC(mod_cgi_handle_subrequest) { if (chunkqueue_length(con->write_queue) > 65536 - 4096) { fdevent_event_clr(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } else if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) { - /* optimistic read from backend, which might re-enable FDEVENT_IN */ + /* optimistic read from backend */ handler_t rc = cgi_recv_response(srv, hctx); /*(might invalidate hctx)*/ if (rc != HANDLER_GO_ON) return rc; /*(unless HANDLER_GO_ON)*/ + fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } } diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c index cd843389..b52d4930 100644 --- a/src/mod_fastcgi.c +++ b/src/mod_fastcgi.c @@ -2409,7 +2409,6 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) { #if !defined(_WIN32) && !defined(__CYGWIN__) if (ioctl(hctx->fd, FIONREAD, &toread)) { if (errno == EAGAIN) { - fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); return 0; } log_error_write(srv, __FILE__, __LINE__, "sd", @@ -2442,7 +2441,6 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) { if (-1 == r) { if (errno == EAGAIN) { - fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); return 0; } log_error_write(srv, __FILE__, __LINE__, "sds", @@ -2452,6 +2450,7 @@ static int fcgi_demux_response(server *srv, handler_ctx *hctx) { } } if (0 == r) { + if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) return 0; log_error_write(srv, __FILE__, __LINE__, "ssdsb", "unexpected end-of-file (perhaps the fastcgi process died):", "pid:", proc->pid, @@ -2966,9 +2965,10 @@ SUBREQUEST_FUNC(mod_fastcgi_handle_subrequest) { if (chunkqueue_length(con->write_queue) > 65536 - 4096) { fdevent_event_clr(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } else if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) { - /* optimistic read from backend, which might re-enable FDEVENT_IN */ + /* optimistic read from backend */ handler_t rc = fcgi_recv_response(srv, hctx); /*(might invalidate hctx)*/ if (rc != HANDLER_GO_ON) return rc; /*(unless HANDLER_GO_ON)*/ + fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } } diff --git a/src/mod_proxy.c b/src/mod_proxy.c index 85279dfb..241d24ea 100644 --- a/src/mod_proxy.c +++ b/src/mod_proxy.c @@ -839,7 +839,6 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { #if !defined(_WIN32) && !defined(__CYGWIN__) if (ioctl(hctx->fd, FIONREAD, &b)) { if (errno == EAGAIN) { - fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); return 0; } log_error_write(srv, __FILE__, __LINE__, "sd", @@ -878,7 +877,6 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { if (-1 == (r = read(hctx->fd, hctx->response->ptr + buffer_string_length(hctx->response), buffer_string_space(hctx->response)))) { if (errno == EAGAIN) { - fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); return 0; } log_error_write(srv, __FILE__, __LINE__, "sds", @@ -951,6 +949,7 @@ static int proxy_demux_response(server *srv, handler_ctx *hctx) { buffer_reset(hctx->response); } } else { + if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) return 0; /* reading from upstream done */ fin = 1; } @@ -1179,9 +1178,10 @@ SUBREQUEST_FUNC(mod_proxy_handle_subrequest) { if (chunkqueue_length(con->write_queue) > 65536 - 4096) { fdevent_event_clr(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } else if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) { - /* optimistic read from backend, which might re-enable FDEVENT_IN */ + /* optimistic read from backend */ handler_t rc = proxy_recv_response(srv, hctx); /*(might invalidate hctx)*/ if (rc != HANDLER_GO_ON) return rc; /*(unless HANDLER_GO_ON)*/ + fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } } diff --git a/src/mod_scgi.c b/src/mod_scgi.c index ef6ab98a..5da4f556 100644 --- a/src/mod_scgi.c +++ b/src/mod_scgi.c @@ -1814,7 +1814,6 @@ static int scgi_demux_response(server *srv, handler_ctx *hctx) { if (-1 == (n = read(hctx->fd, hctx->response->ptr, hctx->response->size - 1))) { if (errno == EAGAIN || errno == EINTR) { /* would block, wait for signal */ - fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); return 0; } /* error */ @@ -2430,9 +2429,10 @@ SUBREQUEST_FUNC(mod_scgi_handle_subrequest) { if (chunkqueue_length(con->write_queue) > 65536 - 4096) { fdevent_event_clr(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } else if (!(fdevent_event_get_interest(srv->ev, hctx->fd) & FDEVENT_IN)) { - /* optimistic read from backend, which might re-enable FDEVENT_IN */ + /* optimistic read from backend */ handler_t rc = scgi_recv_response(srv, hctx); /*(might invalidate hctx)*/ if (rc != HANDLER_GO_ON) return rc; /*(unless HANDLER_GO_ON)*/ + fdevent_event_add(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); } }