|
|
|
@ -1111,6 +1111,7 @@ static void gw_restart_dead_procs(gw_host * const host, log_error_st * const err
|
|
|
|
|
|
|
|
|
|
/* ok, we need a prototype */
|
|
|
|
|
static handler_t gw_handle_fdevent(void *ctx, int revents);
|
|
|
|
|
static handler_t gw_process_fdevent(gw_handler_ctx *hctx, request_st *r, int revents);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__attribute_returns_nonnull__
|
|
|
|
@ -2138,6 +2139,14 @@ handler_t gw_handle_subrequest(request_st * const r, void *p_d) {
|
|
|
|
|
gw_handler_ctx *hctx = r->plugin_ctx[p->id];
|
|
|
|
|
if (NULL == hctx) return HANDLER_GO_ON;
|
|
|
|
|
|
|
|
|
|
const int revents = hctx->revents;
|
|
|
|
|
if (revents) {
|
|
|
|
|
hctx->revents = 0;
|
|
|
|
|
handler_t rc = gw_process_fdevent(hctx, r, revents);
|
|
|
|
|
if (rc != HANDLER_GO_ON && rc != HANDLER_WAIT_FOR_EVENT)
|
|
|
|
|
return rc; /*(might invalidate hctx)*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((r->conf.stream_response_body & FDEVENT_STREAM_RESPONSE_BUFMIN)
|
|
|
|
|
&& r->resp_body_started) {
|
|
|
|
|
if (chunkqueue_length(&r->write_queue) > 65536 - 4096) {
|
|
|
|
@ -2377,10 +2386,12 @@ static handler_t gw_recv_response_error(gw_handler_ctx * const hctx, request_st
|
|
|
|
|
|
|
|
|
|
static handler_t gw_handle_fdevent(void *ctx, int revents) {
|
|
|
|
|
gw_handler_ctx *hctx = ctx;
|
|
|
|
|
request_st * const r = hctx->r;
|
|
|
|
|
|
|
|
|
|
joblist_append(r->con);
|
|
|
|
|
hctx->revents |= revents;
|
|
|
|
|
joblist_append(hctx->con);
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static handler_t gw_process_fdevent(gw_handler_ctx * const hctx, request_st * const r, int revents) {
|
|
|
|
|
if (revents & FDEVENT_IN) {
|
|
|
|
|
handler_t rc = gw_recv_response(hctx, r); /*(might invalidate hctx)*/
|
|
|
|
|
if (rc != HANDLER_GO_ON) return rc; /*(unless HANDLER_GO_ON)*/
|
|
|
|
@ -2393,16 +2404,7 @@ static handler_t gw_handle_fdevent(void *ctx, int revents) {
|
|
|
|
|
/* perhaps this issue is already handled */
|
|
|
|
|
if (revents & (FDEVENT_HUP|FDEVENT_RDHUP)) {
|
|
|
|
|
if (hctx->state == GW_STATE_CONNECT_DELAYED) {
|
|
|
|
|
/* getoptsock will catch this one (right ?)
|
|
|
|
|
*
|
|
|
|
|
* if we are in connect we might get an EINPROGRESS
|
|
|
|
|
* in the first call and an FDEVENT_HUP in the
|
|
|
|
|
* second round
|
|
|
|
|
*
|
|
|
|
|
* FIXME: as it is a bit ugly.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
gw_send_request(hctx, r);
|
|
|
|
|
return gw_send_request(hctx, r); /*(might invalidate hctx)*/
|
|
|
|
|
} else if (r->resp_body_started) {
|
|
|
|
|
/* drain any remaining data from kernel pipe buffers
|
|
|
|
|
* even if (r->conf.stream_response_body
|
|
|
|
@ -2427,6 +2429,7 @@ static handler_t gw_handle_fdevent(void *ctx, int revents) {
|
|
|
|
|
proc->connection_name->ptr, hctx->state);
|
|
|
|
|
|
|
|
|
|
gw_connection_close(hctx, r);
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
}
|
|
|
|
|
} else if (revents & FDEVENT_ERR) {
|
|
|
|
|
log_error(r->conf.errh, __FILE__, __LINE__,
|
|
|
|
@ -2434,7 +2437,7 @@ static handler_t gw_handle_fdevent(void *ctx, int revents) {
|
|
|
|
|
return gw_backend_error(hctx, r); /* HANDLER_FINISHED */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return HANDLER_FINISHED;
|
|
|
|
|
return HANDLER_GO_ON;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
handler_t gw_check_extension(request_st * const r, gw_plugin_data * const p, int uri_path_handler, size_t hctx_sz) {
|
|
|
|
@ -2610,6 +2613,7 @@ handler_t gw_check_extension(request_st * const r, gw_plugin_data * const p, int
|
|
|
|
|
|
|
|
|
|
hctx->ev = r->con->srv->ev;
|
|
|
|
|
hctx->r = r;
|
|
|
|
|
hctx->con = r->con;
|
|
|
|
|
hctx->plugin_data = p;
|
|
|
|
|
hctx->host = host;
|
|
|
|
|
hctx->proc = NULL;
|
|
|
|
|