Lines Matching refs:hctx

118 	handler_ctx * hctx;  in handler_ctx_init()  local
121 hctx = calloc(1, sizeof(*hctx)); in handler_ctx_init()
123 hctx->state = PROXY_STATE_INIT; in handler_ctx_init()
124 hctx->host = NULL; in handler_ctx_init()
126 hctx->response = buffer_init(); in handler_ctx_init()
127 hctx->response_header = buffer_init(); in handler_ctx_init()
129 hctx->wb = chunkqueue_init(); in handler_ctx_init()
131 hctx->fd = -1; in handler_ctx_init()
132 hctx->fde_ndx = -1; in handler_ctx_init()
134 return hctx; in handler_ctx_init()
137 static void handler_ctx_free(handler_ctx *hctx) { in handler_ctx_free() argument
138 buffer_free(hctx->response); in handler_ctx_free()
139 buffer_free(hctx->response_header); in handler_ctx_free()
140 chunkqueue_free(hctx->wb); in handler_ctx_free()
142 free(hctx); in handler_ctx_free()
335 static void proxy_connection_close(server *srv, handler_ctx *hctx) { in proxy_connection_close() argument
339 if (NULL == hctx) return; in proxy_connection_close()
341 p = hctx->plugin_data; in proxy_connection_close()
342 con = hctx->remote_conn; in proxy_connection_close()
344 if (hctx->fd != -1) { in proxy_connection_close()
345 fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd); in proxy_connection_close()
346 fdevent_unregister(srv->ev, hctx->fd); in proxy_connection_close()
348 close(hctx->fd); in proxy_connection_close()
352 if (hctx->host) { in proxy_connection_close()
353 hctx->host->usage--; in proxy_connection_close()
356 handler_ctx_free(hctx); in proxy_connection_close()
360 static int proxy_establish_connection(server *srv, handler_ctx *hctx) { in proxy_establish_connection() argument
368 plugin_data *p = hctx->plugin_data; in proxy_establish_connection()
369 data_proxy *host= hctx->host; in proxy_establish_connection()
370 int proxy_fd = hctx->fd; in proxy_establish_connection()
442 static int proxy_create_env(server *srv, handler_ctx *hctx) { in proxy_create_env() argument
445 connection *con = hctx->remote_conn; in proxy_create_env()
450 b = chunkqueue_get_append_buffer(hctx->wb); in proxy_create_env()
487 hctx->wb->bytes_in += b->used - 1; in proxy_create_env()
510 chunkqueue_append_file(hctx->wb, req_c->file.name, req_c->offset, weHave); in proxy_create_env()
515 hctx->wb->bytes_in += weHave; in proxy_create_env()
524 b = chunkqueue_get_append_buffer(hctx->wb); in proxy_create_env()
531 hctx->wb->bytes_in += weHave; in proxy_create_env()
546 static int proxy_set_state(server *srv, handler_ctx *hctx, proxy_connection_state_t state) { in proxy_set_state() argument
547 hctx->state = state; in proxy_set_state()
548 hctx->state_timestamp = srv->cur_ts; in proxy_set_state()
646 static int proxy_demux_response(server *srv, handler_ctx *hctx) { in proxy_demux_response() argument
651 plugin_data *p = hctx->plugin_data; in proxy_demux_response()
652 connection *con = hctx->remote_conn; in proxy_demux_response()
653 int proxy_fd = hctx->fd; in proxy_demux_response()
656 if (ioctl(hctx->fd, FIONREAD, &b)) { in proxy_demux_response()
670 if (hctx->response->used == 0) { in proxy_demux_response()
672 buffer_prepare_append(hctx->response, b + 1); in proxy_demux_response()
673 hctx->response->used = 1; in proxy_demux_response()
675 buffer_prepare_append(hctx->response, b); in proxy_demux_response()
678 if (-1 == (r = read(hctx->fd, hctx->response->ptr + hctx->response->used - 1, b))) { in proxy_demux_response()
689 hctx->response->used += r; in proxy_demux_response()
690 hctx->response->ptr[hctx->response->used - 1] = '\0'; in proxy_demux_response()
694 "demux: Response buffer len", hctx->response->used, ":", hctx->response, ":"); in proxy_demux_response()
699 buffer_prepare_copy(hctx->response_header, 128); in proxy_demux_response()
706 if (NULL != (c = buffer_search_string_len(hctx->response, "\r\n\r\n", 4))) { in proxy_demux_response()
707 size_t hlen = c - hctx->response->ptr + 4; in proxy_demux_response()
708 size_t blen = hctx->response->used - hlen - 1; in proxy_demux_response()
711 … buffer_append_string_len(hctx->response_header, hctx->response->ptr, c - hctx->response->ptr + 4); in proxy_demux_response()
713 log_error_write(srv, __FILE__, __LINE__, "sb", "Header:", hctx->response_header); in proxy_demux_response()
716 proxy_response_parse(srv, con, p, hctx->response_header); in proxy_demux_response()
728 hctx->response->used = 0; in proxy_demux_response()
732 http_chunk_append_mem(srv, con, hctx->response->ptr, hctx->response->used); in proxy_demux_response()
734 hctx->response->used = 0; in proxy_demux_response()
751 static handler_t proxy_write_request(server *srv, handler_ctx *hctx) { in proxy_write_request() argument
752 data_proxy *host= hctx->host; in proxy_write_request()
753 connection *con = hctx->remote_conn; in proxy_write_request()
760 switch(hctx->state) { in proxy_write_request()
765 if (-1 == hctx->fde_ndx) return HANDLER_ERROR; in proxy_write_request()
775 if (-1 == (hctx->fd = socket(AF_INET6, SOCK_STREAM, 0))) { in proxy_write_request()
782 if (-1 == (hctx->fd = socket(AF_INET, SOCK_STREAM, 0))) { in proxy_write_request()
787 hctx->fde_ndx = -1; in proxy_write_request()
791 fdevent_register(srv->ev, hctx->fd, proxy_handle_fdevent, hctx); in proxy_write_request()
793 if (-1 == fdevent_fcntl_set(srv->ev, hctx->fd)) { in proxy_write_request()
799 switch (proxy_establish_connection(srv, hctx)) { in proxy_write_request()
801 proxy_set_state(srv, hctx, PROXY_STATE_CONNECT); in proxy_write_request()
805 fdevent_event_set(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_OUT); in proxy_write_request()
810 hctx->fde_ndx = -1; in proxy_write_request()
815 proxy_set_state(srv, hctx, PROXY_STATE_PREPARE_WRITE); in proxy_write_request()
822 proxy_create_env(srv, hctx); in proxy_write_request()
824 proxy_set_state(srv, hctx, PROXY_STATE_WRITE); in proxy_write_request()
828 ret = srv->network_backend_write(srv, con, hctx->fd, hctx->wb, MAX_WRITE_LIMIT); in proxy_write_request()
830 chunkqueue_remove_finished_chunks(hctx->wb); in proxy_write_request()
842 if (hctx->wb->bytes_out == hctx->wb->bytes_in) { in proxy_write_request()
843 proxy_set_state(srv, hctx, PROXY_STATE_READ); in proxy_write_request()
845 fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd); in proxy_write_request()
846 fdevent_event_set(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_IN); in proxy_write_request()
848 fdevent_event_set(srv->ev, &(hctx->fde_ndx), hctx->fd, FDEVENT_OUT); in proxy_write_request()
904 handler_ctx *hctx = con->plugin_ctx[p->id]; in SUBREQUEST_FUNC() local
907 if (NULL == hctx) return HANDLER_GO_ON; in SUBREQUEST_FUNC()
911 host = hctx->host; in SUBREQUEST_FUNC()
917 switch(proxy_write_request(srv, hctx)) { in SUBREQUEST_FUNC()
922 hctx->fd); in SUBREQUEST_FUNC()
928 proxy_connection_close(srv, hctx); in SUBREQUEST_FUNC()
958 handler_ctx *hctx = ctx; in proxy_handle_fdevent() local
959 connection *con = hctx->remote_conn; in proxy_handle_fdevent()
960 plugin_data *p = hctx->plugin_data; in proxy_handle_fdevent()
964 hctx->state == PROXY_STATE_READ) { in proxy_handle_fdevent()
968 "proxy: fdevent-in", hctx->state); in proxy_handle_fdevent()
971 switch (proxy_demux_response(srv, hctx)) { in proxy_handle_fdevent()
976 proxy_connection_close(srv, hctx); in proxy_handle_fdevent()
999 "proxy: fdevent-out", hctx->state); in proxy_handle_fdevent()
1002 if (hctx->state == PROXY_STATE_CONNECT) { in proxy_handle_fdevent()
1007 fdevent_event_del(srv->ev, &(hctx->fde_ndx), hctx->fd); in proxy_handle_fdevent()
1008 hctx->fde_ndx = -1; in proxy_handle_fdevent()
1011 if (0 != getsockopt(hctx->fd, SOL_SOCKET, SO_ERROR, &socket_error, &socket_error_len)) { in proxy_handle_fdevent()
1021 "port:", hctx->host->port); in proxy_handle_fdevent()
1030 proxy_set_state(srv, hctx, PROXY_STATE_PREPARE_WRITE); in proxy_handle_fdevent()
1033 if (hctx->state == PROXY_STATE_PREPARE_WRITE || in proxy_handle_fdevent()
1034 hctx->state == PROXY_STATE_WRITE) { in proxy_handle_fdevent()
1043 "proxy: out", hctx->state); in proxy_handle_fdevent()
1051 "proxy: fdevent-hup", hctx->state); in proxy_handle_fdevent()
1054 if (hctx->state == PROXY_STATE_CONNECT) { in proxy_handle_fdevent()
1062 if (hctx->host) { in proxy_handle_fdevent()
1063 hctx->host->is_disabled = 1; in proxy_handle_fdevent()
1064 hctx->host->disable_ts = srv->cur_ts; in proxy_handle_fdevent()
1066 hctx->host->host, in proxy_handle_fdevent()
1067 hctx->host->port, in proxy_handle_fdevent()
1068 hctx->fd); in proxy_handle_fdevent()
1071 hctx->host->is_disabled = 1; in proxy_handle_fdevent()
1072 hctx->host->disable_ts = srv->cur_ts; in proxy_handle_fdevent()
1074 proxy_connection_close(srv, hctx); in proxy_handle_fdevent()
1082 proxy_connection_close(srv, hctx); in proxy_handle_fdevent()
1097 proxy_connection_close(srv, hctx); in proxy_handle_fdevent()
1106 proxy_connection_close(srv, hctx); in proxy_handle_fdevent()
1302 handler_ctx *hctx; in mod_proxy_check_extension() local
1303 hctx = handler_ctx_init(); in mod_proxy_check_extension()
1305 hctx->path_info_offset = path_info_offset; in mod_proxy_check_extension()
1306 hctx->remote_conn = con; in mod_proxy_check_extension()
1307 hctx->plugin_data = p; in mod_proxy_check_extension()
1308 hctx->host = host; in mod_proxy_check_extension()
1310 con->plugin_ctx[p->id] = hctx; in mod_proxy_check_extension()