Lines Matching refs:hctx

96 	handler_ctx *hctx;  member
102 handler_ctx *hctx = ck_calloc(1, sizeof(*hctx)); in cgi_handler_ctx_init() local
103 hctx->response = chunk_buffer_acquire(); in cgi_handler_ctx_init()
104 hctx->fd = -1; in cgi_handler_ctx_init()
105 hctx->fdtocgi = -1; in cgi_handler_ctx_init()
106 return hctx; in cgi_handler_ctx_init()
109 static void cgi_handler_ctx_free(handler_ctx *hctx) { in cgi_handler_ctx_free() argument
110 chunk_buffer_release(hctx->response); in cgi_handler_ctx_free()
111 free(hctx); in cgi_handler_ctx_free()
378 static cgi_pid_t * cgi_pid_add(plugin_data *p, pid_t pid, handler_ctx *hctx) { in cgi_pid_add() argument
382 cgi_pid->hctx = hctx; in cgi_pid_add()
407 static void cgi_connection_close_fdtocgi(handler_ctx *hctx) { in cgi_connection_close_fdtocgi() argument
409 if (-1 == hctx->fdtocgi) return; in cgi_connection_close_fdtocgi()
410 struct fdevents * const ev = hctx->ev; in cgi_connection_close_fdtocgi()
411 fdevent_fdnode_event_del(ev, hctx->fdntocgi); in cgi_connection_close_fdtocgi()
413 fdevent_sched_close(ev, hctx->fdntocgi); in cgi_connection_close_fdtocgi()
414 hctx->fdntocgi = NULL; in cgi_connection_close_fdtocgi()
415 hctx->fdtocgi = -1; in cgi_connection_close_fdtocgi()
418 static void cgi_connection_close(handler_ctx *hctx) { in cgi_connection_close() argument
425 if (hctx->fd != -1) { in cgi_connection_close()
426 struct fdevents * const ev = hctx->ev; in cgi_connection_close()
428 fdevent_fdnode_event_del(ev, hctx->fdn); in cgi_connection_close()
430 fdevent_sched_close(ev, hctx->fdn); in cgi_connection_close()
431 hctx->fdn = NULL; in cgi_connection_close()
434 if (hctx->fdtocgi != -1) { in cgi_connection_close()
435 cgi_connection_close_fdtocgi(hctx); /*(closes only hctx->fdtocgi)*/ in cgi_connection_close()
438 plugin_data * const p = hctx->plugin_data; in cgi_connection_close()
439 request_st * const r = hctx->r; in cgi_connection_close()
442 if (hctx->cgi_pid) { in cgi_connection_close()
443 cgi_pid_kill(hctx->cgi_pid, SIGTERM); in cgi_connection_close()
444 hctx->cgi_pid->hctx = NULL; in cgi_connection_close()
446 cgi_handler_ctx_free(hctx); in cgi_connection_close()
455 handler_ctx *hctx = r->plugin_ctx[((plugin_data *)p_d)->id]; in cgi_connection_close_callback() local
456 if (hctx) { in cgi_connection_close_callback()
459 cgi_connection_close(hctx); in cgi_connection_close_callback()
465 static int cgi_write_request(handler_ctx *hctx, int fd);
469 handler_ctx *hctx = ctx; in cgi_handle_fdevent_send() local
470 hctx->wr_revents |= revents; in cgi_handle_fdevent_send()
471 joblist_append(hctx->con); in cgi_handle_fdevent_send()
476 static handler_t cgi_process_wr_revents (handler_ctx * const hctx, request_st * const r, int revent… in cgi_process_wr_revents() argument
478 if (0 != cgi_write_request(hctx, hctx->fdtocgi)) { in cgi_process_wr_revents()
479 cgi_connection_close(hctx); in cgi_process_wr_revents()
495 cgi_connection_close_fdtocgi(hctx); /*(closes only hctx->fdtocgi)*/ in cgi_process_wr_revents()
501 cgi_connection_close(hctx); in cgi_process_wr_revents()
511 handler_ctx *hctx = (handler_ctx *)opts->pdata; in cgi_response_headers() local
514 if (hctx->conf.upgrade && r->http_status == 101) { in cgi_response_headers()
545 if (hctx->conf.upgrade in cgi_response_headers()
548 hctx->conf.upgrade = 0; in cgi_response_headers()
549 r->reqbody_length = hctx->orig_reqbody_length; in cgi_response_headers()
551 cgi_connection_close_fdtocgi(hctx); /*(closes hctx->fdtocgi)*/ in cgi_response_headers()
561 static handler_t cgi_local_redir(request_st * const r, handler_ctx * const hctx) { in cgi_local_redir() argument
562 buffer_clear(hctx->response); in cgi_local_redir()
563 chunk_buffer_yield(hctx->response); in cgi_local_redir()
571 static int cgi_recv_response(request_st * const r, handler_ctx * const hctx) { in cgi_recv_response() argument
573 switch (http_response_read(r, &hctx->opts, in cgi_recv_response()
574 hctx->response, hctx->fdn)) { in cgi_recv_response()
577 hctx->read_ts = log_monotonic_secs; in cgi_recv_response()
583 cgi_connection_close(hctx); in cgi_recv_response()
586 return cgi_local_redir(r, hctx); /* HANDLER_COMEBACK */ in cgi_recv_response()
592 handler_ctx *hctx = ctx; in cgi_handle_fdevent() local
593 hctx->rd_revents |= revents; in cgi_handle_fdevent()
594 joblist_append(hctx->con); in cgi_handle_fdevent()
599 static handler_t cgi_process_rd_revents(handler_ctx * const hctx, request_st * const r, int revents… in cgi_process_rd_revents() argument
601 handler_t rc = cgi_recv_response(r, hctx); /*(might invalidate hctx)*/ in cgi_process_rd_revents()
618 rc = cgi_recv_response(r,hctx); /*(might invalidate hctx)*/ in cgi_process_rd_revents()
622 } else if (!buffer_is_blank(hctx->response)) { in cgi_process_rd_revents()
625 if (0 != http_chunk_append_buffer(r, hctx->response)) { in cgi_process_rd_revents()
626 cgi_connection_close(hctx); in cgi_process_rd_revents()
631 cgi_connection_close(hctx); in cgi_process_rd_revents()
635 cgi_connection_close(hctx); in cgi_process_rd_revents()
669 static int cgi_write_request(handler_ctx *hctx, int fd) { in cgi_write_request() argument
670 request_st * const r = hctx->r; in cgi_write_request()
682 hctx->write_ts = log_monotonic_secs; in cgi_write_request()
714 if (cq->bytes_out == (off_t)r->reqbody_length && !hctx->conf.upgrade) { in cgi_write_request()
717 if (-1 == hctx->fdtocgi) { /*(received request body sent in initial send to pipe buffer)*/ in cgi_write_request()
723 cgi_connection_close_fdtocgi(hctx); /*(closes only hctx->fdtocgi)*/ in cgi_write_request()
734 struct fdevents * const ev = hctx->ev; in cgi_write_request()
735 if (-1 == hctx->fdtocgi) { /*(not registered yet)*/ in cgi_write_request()
736 hctx->fdtocgi = fd; in cgi_write_request()
737 hctx->fdntocgi = fdevent_register(ev, hctx->fdtocgi, cgi_handle_fdevent_send, hctx); in cgi_write_request()
740 if ((fdevent_fdnode_interest(hctx->fdntocgi) & FDEVENT_OUT)) { in cgi_write_request()
741 fdevent_fdnode_event_set(ev, hctx->fdntocgi, 0); in cgi_write_request()
745 hctx->write_ts = log_monotonic_secs; in cgi_write_request()
746 fdevent_fdnode_event_set(ev, hctx->fdntocgi, FDEVENT_OUT); in cgi_write_request()
753 static int cgi_create_env(request_st * const r, plugin_data * const p, handler_ctx * const hctx, bu… in cgi_create_env() argument
779 && !hctx->conf.upgrade) { in cgi_create_env()
840 if (hctx->conf.upgrade) { in cgi_create_env()
841 r->reqbody_length = hctx->orig_reqbody_length; in cgi_create_env()
848 if (hctx->conf.upgrade) in cgi_create_env()
940 hctx->fd = from_cgi_fds[0]; in cgi_create_env()
941 hctx->cgi_pid = cgi_pid_add(p, pid, hctx); in cgi_create_env()
951 && 0 == cgi_write_request(hctx, to_cgi_fds[1])) { in cgi_create_env()
960 close(hctx->fd); in cgi_create_env()
961 hctx->fd = -1; in cgi_create_env()
962 cgi_connection_close(hctx); in cgi_create_env()
968 struct fdevents * const ev = hctx->ev; in cgi_create_env()
969 hctx->fdn = fdevent_register(ev, hctx->fd, cgi_handle_fdevent, hctx); in cgi_create_env()
970 if (-1 == fdevent_fcntl_set_nb(hctx->fd)) { in cgi_create_env()
972 cgi_connection_close(hctx); in cgi_create_env()
975 hctx->read_ts = log_monotonic_secs; in cgi_create_env()
976 fdevent_fdnode_event_set(ev, hctx->fdn, FDEVENT_IN | FDEVENT_RDHUP); in cgi_create_env()
1024 handler_ctx *hctx = cgi_handler_ctx_init(); in URIHANDLER_FUNC() local
1025 hctx->ev = r->con->srv->ev; in URIHANDLER_FUNC()
1026 hctx->r = r; in URIHANDLER_FUNC()
1027 hctx->con = r->con; in URIHANDLER_FUNC()
1028 hctx->plugin_data = p; in URIHANDLER_FUNC()
1029 hctx->cgi_handler = &ds->value; in URIHANDLER_FUNC()
1030 memcpy(&hctx->conf, &p->conf, sizeof(plugin_config)); in URIHANDLER_FUNC()
1034 hctx->conf.upgrade = 0; in URIHANDLER_FUNC()
1035 else if (!hctx->conf.upgrade || r->http_version != HTTP_VERSION_1_1) { in URIHANDLER_FUNC()
1036 hctx->conf.upgrade = 0; in URIHANDLER_FUNC()
1040 if (hctx->conf.upgrade) { in URIHANDLER_FUNC()
1041 hctx->orig_reqbody_length = r->reqbody_length; in URIHANDLER_FUNC()
1044 hctx->opts.max_per_read = in URIHANDLER_FUNC()
1051 hctx->opts.fdfmt = S_IFIFO; in URIHANDLER_FUNC()
1052 hctx->opts.backend = BACKEND_CGI; in URIHANDLER_FUNC()
1053 hctx->opts.authorizer = 0; in URIHANDLER_FUNC()
1054 hctx->opts.local_redir = hctx->conf.local_redir; in URIHANDLER_FUNC()
1055 hctx->opts.xsendfile_allow = hctx->conf.xsendfile_allow; in URIHANDLER_FUNC()
1056 hctx->opts.xsendfile_docroot = hctx->conf.xsendfile_docroot; in URIHANDLER_FUNC()
1057 hctx->opts.pdata = hctx; in URIHANDLER_FUNC()
1058 hctx->opts.headers = cgi_response_headers; in URIHANDLER_FUNC()
1059 r->plugin_ctx[p->id] = hctx; in URIHANDLER_FUNC()
1073 handler_ctx * const hctx = r->plugin_ctx[p->id]; in SUBREQUEST_FUNC() local
1074 if (NULL == hctx) return HANDLER_GO_ON; in SUBREQUEST_FUNC()
1078 && hctx->conf.limits && hctx->conf.limits->signal_fin) { in SUBREQUEST_FUNC()
1081 if (-1 == hctx->fd) return HANDLER_ERROR; /*(CGI not yet spawned)*/ in SUBREQUEST_FUNC()
1082 if (hctx->cgi_pid) /* send signal to notify CGI about TCP FIN */ in SUBREQUEST_FUNC()
1083 cgi_pid_kill(hctx->cgi_pid, hctx->conf.limits->signal_fin); in SUBREQUEST_FUNC()
1086 const int rd_revents = hctx->rd_revents; in SUBREQUEST_FUNC()
1087 const int wr_revents = hctx->wr_revents; in SUBREQUEST_FUNC()
1089 hctx->rd_revents = 0; in SUBREQUEST_FUNC()
1090 handler_t rc = cgi_process_rd_revents(hctx, r, rd_revents); in SUBREQUEST_FUNC()
1094 hctx->wr_revents = 0; in SUBREQUEST_FUNC()
1095 handler_t rc = cgi_process_wr_revents(hctx, r, wr_revents); in SUBREQUEST_FUNC()
1102 fdevent_fdnode_event_clr(hctx->ev, hctx->fdn, FDEVENT_IN); in SUBREQUEST_FUNC()
1103 } else if (!(fdevent_fdnode_interest(hctx->fdn) & FDEVENT_IN)) { in SUBREQUEST_FUNC()
1105 handler_t rc = cgi_recv_response(r, hctx); /*(might invalidate hctx)*/ in SUBREQUEST_FUNC()
1107 hctx->read_ts = log_monotonic_secs; in SUBREQUEST_FUNC()
1108 fdevent_fdnode_event_add(hctx->ev, hctx->fdn, FDEVENT_IN); in SUBREQUEST_FUNC()
1123 && !(hctx->conf.upgrade && -1 == hctx->fd in SUBREQUEST_FUNC()
1129 if (-1 == hctx->fd) { in SUBREQUEST_FUNC()
1134 if (-1 == r->reqbody_length && !hctx->conf.upgrade) { in SUBREQUEST_FUNC()
1139 if (cgi_create_env(r, p, hctx, hctx->cgi_handler)) { in SUBREQUEST_FUNC()
1146 if (fdevent_fdnode_interest(hctx->fdntocgi) & FDEVENT_OUT) in SUBREQUEST_FUNC()
1148 if (0 != cgi_write_request(hctx, hctx->fdtocgi)) { in SUBREQUEST_FUNC()
1149 cgi_connection_close(hctx); in SUBREQUEST_FUNC()
1161 static void cgi_trigger_hctx_timeout(handler_ctx * const hctx, const char * const msg) { in cgi_trigger_hctx_timeout() argument
1162 request_st * const r = hctx->r; in cgi_trigger_hctx_timeout()
1167 msg, r->physical.path.ptr, (long long)hctx->cgi_pid->pid); in cgi_trigger_hctx_timeout()
1173 handler_t rc = cgi_recv_response(r, hctx); /*(might invalidate hctx)*/ in cgi_trigger_hctx_timeout()
1178 cgi_connection_close(hctx); in cgi_trigger_hctx_timeout()
1189 handler_ctx * const hctx = cgi_pid->hctx; in cgi_trigger_cb() local
1190 if (!hctx) continue; /*(already called cgi_pid_kill())*/ in cgi_trigger_cb()
1191 const cgi_limits * const limits = hctx->conf.limits; in cgi_trigger_cb()
1193 if (limits->read_timeout && hctx->fdn in cgi_trigger_cb()
1194 && (fdevent_fdnode_interest(hctx->fdn) & FDEVENT_IN) in cgi_trigger_cb()
1195 && mono - hctx->read_ts > limits->read_timeout) { in cgi_trigger_cb()
1196 cgi_trigger_hctx_timeout(hctx, "read"); in cgi_trigger_cb()
1199 if (limits->write_timeout && hctx->fdntocgi in cgi_trigger_cb()
1200 && (fdevent_fdnode_interest(hctx->fdntocgi) & FDEVENT_OUT) in cgi_trigger_cb()
1201 && mono - hctx->write_ts > limits->write_timeout) { in cgi_trigger_cb()
1202 cgi_trigger_hctx_timeout(hctx, "write"); in cgi_trigger_cb()
1217 handler_ctx * const hctx = cgi_pid->hctx; in cgi_waitpid_cb() local
1218 if (hctx) hctx->cgi_pid = NULL; in cgi_waitpid_cb()
1226 log_error_st *errh = hctx ? hctx->r->conf.errh : srv->errh; in cgi_waitpid_cb()
1232 log_error_st *errh = hctx ? hctx->r->conf.errh : srv->errh; in cgi_waitpid_cb()