Lines Matching refs:wsi
40 __lws_reset_wsi(struct lws *wsi)
42 if (!wsi)
47 lws_free_set_NULL(wsi->cli_hostname_copy);
51 if (wsi->conmon.dns_results_copy) {
52 lws_conmon_addrinfo_destroy(wsi->conmon.dns_results_copy);
53 wsi->conmon.dns_results_copy = NULL;
56 wsi->conmon.ciu_dns =
57 wsi->conmon.ciu_sockconn =
58 wsi->conmon.ciu_tls =
59 wsi->conmon.ciu_txn_resp = 0;
63 * if we have wsi in our transaction queue, if we are closing we
66 if (wsi->a.vhost) {
69 lws_dll2_remove(&wsi->dll_cli_active_conns);
71 lws_dll2_foreach_safe(&wsi->dll2_cli_txn_queue_owner, NULL,
83 lws_dll2_remove(&wsi->dll2_cli_txn_queue);
87 if (wsi->a.vhost) {
88 lws_vhost_lock(wsi->a.vhost);
89 lws_dll2_remove(&wsi->vh_awaiting_socket);
90 lws_vhost_unlock(wsi->a.vhost);
97 if (wsi->a.protocol && wsi->a.protocol->per_session_data_size &&
98 wsi->user_space && !wsi->user_space_externally_allocated) {
100 lws_sul_debug_zombies(wsi->a.context, wsi->user_space,
101 wsi->a.protocol->per_session_data_size, __func__);
102 lws_free_set_NULL(wsi->user_space);
106 * Don't let buflist content or state from the wsi's previous life
110 lws_buflist_destroy_all_segments(&wsi->buflist);
111 lws_dll2_remove(&wsi->dll_buflist);
112 lws_buflist_destroy_all_segments(&wsi->buflist_out);
114 if (wsi->udp) {
115 /* confirm no sul left scheduled in wsi->udp itself */
116 lws_sul_debug_zombies(wsi->a.context, wsi->udp,
117 sizeof(*wsi->udp), "close udp wsi");
118 lws_free_set_NULL(wsi->udp);
121 wsi->retry = 0;
124 lws_dll2_remove(&wsi->dll2_cli_txn_queue);
125 lws_dll2_remove(&wsi->dll_cli_active_conns);
126 if (wsi->cli_hostname_copy)
127 lws_free_set_NULL(wsi->cli_hostname_copy);
131 lws_async_dns_cancel(wsi);
135 if (wsi->http.buflist_post_body)
136 lws_buflist_destroy_all_segments(&wsi->http.buflist_post_body);
140 lws_dll2_remove(&wsi->listen_list);
144 if (wsi->a.vhost)
145 lws_dll2_remove(&wsi->dll_cli_active_conns);
148 __lws_same_vh_protocol_remove(wsi);
150 //lws_free_set_NULL(wsi->stash);
151 lws_free_set_NULL(wsi->cli_hostname_copy);
155 lws_peer_track_wsi_close(wsi->a.context, wsi->peer);
156 wsi->peer = NULL;
159 /* since we will destroy the wsi, make absolutely sure now */
162 __lws_ssl_remove_wsi_from_buffered_list(wsi);
164 __lws_wsi_remove_from_sul(wsi);
166 if (lws_rops_fidx(wsi->role_ops, LWS_ROPS_destroy_role))
167 lws_rops_func_fidx(wsi->role_ops,
168 LWS_ROPS_destroy_role).destroy_role(wsi);
171 __lws_header_table_detach(wsi, 0);
176 * Let's try to clean out the h2-ness of the wsi
179 memset(&wsi->h2, 0, sizeof(wsi->h2));
181 wsi->hdr_parsing_completed = wsi->mux_substream =
182 wsi->upgraded_to_http2 = wsi->mux_stream_immortal =
183 wsi->h2_acked_settings = wsi->seen_nonpseudoheader =
184 wsi->socket_is_permanently_unusable = wsi->favoured_pollin =
185 wsi->already_did_cce = wsi->told_user_closed =
186 wsi->waiting_to_send_close_frame = wsi->close_needs_ack =
187 wsi->parent_pending_cb_on_writable = wsi->seen_zero_length_recv =
188 wsi->close_when_buffered_out_drained = wsi->could_have_pending = 0;
192 wsi->do_ws = wsi->chunked = wsi->client_rx_avail =
193 wsi->client_http_body_pending = wsi->transaction_from_pipeline_queue =
194 wsi->keepalive_active = wsi->keepalive_rejected =
195 wsi->redirected_to_get = wsi->client_pipeline = wsi->client_h2_alpn =
196 wsi->client_mux_substream = wsi->client_mux_migrated =
197 wsi->tls_session_reused = wsi->perf_done = 0;
199 wsi->immortal_substream_count = 0;
206 __lws_free_wsi(struct lws *wsi)
210 if (!wsi)
213 lws_context_assert_lock_held(wsi->a.context);
216 if (wsi->for_ss) {
219 if (wsi->client_bound_sspc) {
221 wsi->a.opaque_user_data;
224 wsi->a.opaque_user_data = NULL;
233 wsi->a.opaque_user_data;
236 h->wsi = NULL;
237 wsi->a.opaque_user_data = NULL;
243 vh = wsi->a.vhost;
245 __lws_reset_wsi(wsi);
246 __lws_wsi_remove_from_sul(wsi);
250 __lws_vhost_unbind_wsi(wsi); /* req cx + vh lock */
253 if (wsi->stash)
254 lws_free_set_NULL(wsi->stash);
257 if (wsi->a.context->event_loop_ops->destroy_wsi)
258 wsi->a.context->event_loop_ops->destroy_wsi(wsi);
260 lwsl_wsi_debug(wsi, "tsi fds count %d\n",
261 wsi->a.context->pt[(int)wsi->tsi].fds_count);
263 /* confirm no sul left scheduled in wsi itself */
264 lws_sul_debug_zombies(wsi->a.context, wsi, sizeof(*wsi), __func__);
266 __lws_lc_untag(wsi->a.context, &wsi->lc);
267 lws_free(wsi);
272 lws_remove_child_from_any_parent(struct lws *wsi)
277 if (!wsi->parent)
281 pwsi = &wsi->parent->child_list;
283 if (*pwsi == wsi) {
284 lwsl_wsi_info(wsi, "detach from parent %s",
285 lws_wsi_tag(wsi->parent));
287 if (wsi->parent->a.protocol)
288 wsi->parent->a.protocol->callback(wsi,
290 wsi->parent->user_space, wsi, 0);
292 *pwsi = wsi->sibling_list;
299 lwsl_wsi_err(wsi, "failed to detach from parent");
301 wsi->parent = NULL;
306 lws_inform_client_conn_fail(struct lws *wsi, void *arg, size_t len)
308 lws_addrinfo_clean(wsi);
310 if (wsi->already_did_cce)
313 wsi->already_did_cce = 1;
315 if (!wsi->a.protocol)
318 if (!wsi->client_suppress_CONNECTION_ERROR)
319 wsi->a.protocol->callback(wsi,
321 wsi->user_space, arg, len);
326 lws_addrinfo_clean(struct lws *wsi)
329 struct lws_dll2 *d = lws_dll2_get_head(&wsi->dns_sorted_list), *d1;
346 __lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason,
355 if (!wsi)
358 lwsl_wsi_info(wsi, "caller: %s", caller);
360 lws_access_log(wsi);
362 if (!lws_dll2_is_detached(&wsi->dll_buflist))
363 lwsl_wsi_info(wsi, "going down with stuff in buflist");
365 context = wsi->a.context;
366 pt = &context->pt[(int)wsi->tsi];
368 if (pt->pipe_wsi == wsi)
373 /* wsi level: only reports if dangling caliper */
374 if (wsi->cal_conn.mt && wsi->cal_conn.us_start) {
375 if ((lws_metrics_priv_to_pub(wsi->cal_conn.mt)->flags) & LWSMTFL_REPORT_HIST) {
376 lws_metrics_caliper_report_hist(wsi->cal_conn, (struct lws *)NULL);
378 lws_metrics_caliper_report(wsi->cal_conn, METRES_NOGO);
379 lws_metrics_caliper_done(wsi->cal_conn);
382 lws_metrics_caliper_done(wsi->cal_conn);
386 if (wsi == context->async_dns.wsi)
387 context->async_dns.wsi = NULL;
394 lws_free_set_NULL(wsi->cli_hostname_copy);
395 wsi->client_mux_substream_was = wsi->client_mux_substream;
397 lws_addrinfo_clean(wsi);
401 if (wsi->mux_stream_immortal)
402 lws_http_close_immortal(wsi);
406 if (wsi->child_list) {
407 wsi2 = wsi->child_list;
417 wsi->child_list = NULL;
421 if (wsi->role_ops == &role_ops_raw_file) {
422 lws_remove_child_from_any_parent(wsi);
423 __remove_wsi_socket_from_fds(wsi);
424 if (wsi->a.protocol)
425 wsi->a.protocol->callback(wsi, wsi->role_ops->close_cb[0],
426 wsi->user_space, NULL, 0);
431 wsi->wsistate_pre_close = wsi->wsistate;
434 if (wsi->role_ops == &role_ops_cgi) {
436 // lwsl_debug("%s: closing stdwsi index %d\n", __func__, (int)wsi->lsp_channel);
439 if (wsi->parent && wsi->parent->http.cgi) {
446 // if (wsi->parent->child_list == wsi && !wsi->sibling_list)
447 // lws_cgi_remove_and_kill(wsi->parent);
450 if (wsi->parent->http.cgi && wsi->parent->http.cgi->lsp)
451 wsi->parent->http.cgi->lsp->stdwsi[(int)wsi->lsp_channel] =
454 wsi->socket_is_permanently_unusable = 1;
459 if (wsi->http.cgi)
460 lws_cgi_remove_and_kill(wsi);
464 if (!wsi->close_is_redirect)
465 lws_free_set_NULL(wsi->stash);
468 if (wsi->role_ops == &role_ops_raw_skt) {
469 wsi->socket_is_permanently_unusable = 1;
473 if (lwsi_role_http(wsi) && lwsi_role_server(wsi) &&
474 wsi->http.fop_fd != NULL)
475 lws_vfs_file_close(&wsi->http.fop_fd);
478 if (lwsi_state(wsi) == LRS_DEAD_SOCKET)
481 if (wsi->socket_is_permanently_unusable ||
483 lwsi_state(wsi) == LRS_SHUTDOWN)
486 switch (lwsi_state_PRE_CLOSE(wsi)) {
497 if (lws_has_buffered_out(wsi)
499 || wsi->http.comp_ctx.buflist_comp ||
500 wsi->http.comp_ctx.may_have_more
503 lws_callback_on_writable(wsi);
506 lwsl_wsi_info(wsi, " end LRS_FLUSHING_BEFORE_CLOSE");
509 if (lws_has_buffered_out(wsi)
511 || wsi->http.comp_ctx.buflist_comp ||
512 wsi->http.comp_ctx.may_have_more
515 lwsl_wsi_info(wsi, "LRS_FLUSHING_BEFORE_CLOSE");
516 lwsi_set_state(wsi, LRS_FLUSHING_BEFORE_CLOSE);
517 __lws_set_timeout(wsi,
524 if (lwsi_state(wsi) == LRS_WAITING_CONNECT ||
525 lwsi_state(wsi) == LRS_WAITING_DNS ||
526 lwsi_state(wsi) == LRS_H1C_ISSUE_HANDSHAKE)
529 if (!wsi->told_user_closed && wsi->user_space && wsi->a.protocol &&
530 wsi->protocol_bind_balance) {
531 wsi->a.protocol->callback(wsi,
532 wsi->role_ops->protocol_unbind_cb[
533 !!lwsi_role_server(wsi)],
534 wsi->user_space, (void *)__func__, 0);
535 wsi->protocol_bind_balance = 0;
550 if (lws_rops_fidx(wsi->role_ops, LWS_ROPS_close_via_role_protocol) &&
551 lws_rops_func_fidx(wsi->role_ops, LWS_ROPS_close_via_role_protocol).
552 close_via_role_protocol(wsi, reason)) {
553 lwsl_wsi_info(wsi, "close_via_role took over (sockfd %d)",
554 wsi->desc.sockfd);
560 lwsl_wsi_debug(wsi, "real just_kill_connection A: (sockfd %d)",
561 wsi->desc.sockfd);
564 lws_threadpool_wsi_closing(wsi);
568 if (lwsi_role_http(wsi) && lwsi_role_server(wsi) &&
569 wsi->http.fop_fd != NULL)
570 lws_vfs_file_close(&wsi->http.fop_fd);
573 lws_sul_cancel(&wsi->sul_connect_timeout);
575 lws_async_dns_cancel(wsi);
579 if (wsi->http.buflist_post_body)
580 lws_buflist_destroy_all_segments(&wsi->http.buflist_post_body);
583 if (wsi->udp) {
584 /* confirm no sul left scheduled in wsi->udp itself */
585 lws_sul_debug_zombies(wsi->a.context, wsi->udp,
586 sizeof(*wsi->udp), "close udp wsi");
588 lws_free_set_NULL(wsi->udp);
592 if (lws_rops_fidx(wsi->role_ops, LWS_ROPS_close_kill_connection))
593 lws_rops_func_fidx(wsi->role_ops,
595 close_kill_connection(wsi, reason);
599 if (!wsi->told_user_closed && wsi->user_space &&
600 wsi->protocol_bind_balance && wsi->a.protocol) {
601 lwsl_debug("%s: %s: DROP_PROTOCOL %s\n", __func__, lws_wsi_tag(wsi),
602 wsi->a.protocol ? wsi->a.protocol->name: "NULL");
603 if (wsi->a.protocol)
604 wsi->a.protocol->callback(wsi,
605 wsi->role_ops->protocol_unbind_cb[
606 !!lwsi_role_server(wsi)],
607 wsi->user_space, (void *)__func__, 0);
608 wsi->protocol_bind_balance = 0;
618 (lwsi_state(wsi) == LRS_WAITING_SERVER_REPLY &&
619 wsi->role_ops == &role_ops_ws) ||
621 lwsi_state(wsi) == LRS_WAITING_DNS ||
622 lwsi_state(wsi) == LRS_WAITING_CONNECT) &&
623 !wsi->already_did_cce && wsi->a.protocol &&
624 !wsi->close_is_redirect) {
627 lwsl_wsi_debug(wsi, "closing in unestablished state 0x%x",
628 lwsi_state(wsi));
629 wsi->socket_is_permanently_unusable = 1;
631 lws_inform_client_conn_fail(wsi,
643 if (wsi->role_ops != &role_ops_raw_skt && !lwsi_role_client(wsi) &&
644 lwsi_state(wsi) != LRS_SHUTDOWN &&
645 lwsi_state(wsi) != LRS_UNCONNECTED &&
647 !wsi->socket_is_permanently_unusable) {
650 if (lws_is_ssl(wsi) && wsi->tls.ssl) {
652 switch (__lws_tls_shutdown(wsi)) {
664 __func__, lws_wsi_tag(wsi), (int)(lws_intptr_t)wsi->desc.sockfd,
665 lwsi_state(wsi));
666 if (!wsi->socket_is_permanently_unusable &&
667 lws_socket_is_valid(wsi->desc.sockfd)) {
668 wsi->socket_is_permanently_unusable = 1;
669 n = shutdown(wsi->desc.sockfd, SHUT_WR);
673 lwsl_wsi_debug(wsi, "closing: shutdown (state 0x%x) ret %d",
674 lwsi_state(wsi), LWS_ERRNO);
682 if (!wsi->socket_is_permanently_unusable &&
684 !wsi->close_is_redirect &&
686 lws_socket_is_valid(wsi->desc.sockfd) &&
687 lwsi_state(wsi) != LRS_SHUTDOWN &&
689 __lws_change_pollfd(wsi, LWS_POLLOUT, LWS_POLLIN);
690 lwsi_set_state(wsi, LRS_SHUTDOWN);
691 __lws_set_timeout(wsi, PENDING_TIMEOUT_SHUTDOWN_FLUSH,
699 lwsl_wsi_info(wsi, "real just_kill_connection: sockfd %d\n",
700 wsi->desc.sockfd);
703 if (wsi->http.rw) {
704 lws_rewrite_destroy(wsi->http.rw);
705 wsi->http.rw = NULL;
709 if (wsi->http.pending_return_headers)
710 lws_free_set_NULL(wsi->http.pending_return_headers);
716 __lws_ssl_remove_wsi_from_buffered_list(wsi);
717 __lws_wsi_remove_from_sul(wsi);
719 //if (wsi->told_event_loop_closed) // cgi std close case (dummy-callback)
723 __remove_wsi_socket_from_fds(wsi);
725 lwsi_set_state(wsi, LRS_DEAD_SOCKET);
726 lws_buflist_destroy_all_segments(&wsi->buflist);
727 lws_dll2_remove(&wsi->dll_buflist);
729 if (lws_rops_fidx(wsi->role_ops, LWS_ROPS_close_role))
730 lws_rops_func_fidx(wsi->role_ops, LWS_ROPS_close_role).
731 close_role(pt, wsi);
736 if ((lwsi_state_est_PRE_CLOSE(wsi) ||
738 (wsi->role_ops == &role_ops_raw_skt && !lwsi_role_client(wsi)) ||
739 lwsi_state_PRE_CLOSE(wsi) == LRS_WAITING_SERVER_REPLY) &&
740 !wsi->told_user_closed &&
741 wsi->role_ops->close_cb[lwsi_role_server(wsi)]) {
742 if (!wsi->upgraded_to_http2 || !lwsi_role_client(wsi))
745 * The network wsi for a client h2 connection shouldn't
753 if (!wsi->told_user_closed &&
754 !lws_dll2_is_detached(&wsi->vh_awaiting_socket))
762 lwsl_wsi_info(wsi, "cce=%d", ccb);
764 pro = wsi->a.protocol;
766 if (wsi->already_did_cce)
774 if (!wsi->close_is_redirect && !ccb &&
775 (lwsi_state_PRE_CLOSE(wsi) & LWSIFS_NOT_EST) &&
776 lwsi_role_client(wsi)) {
777 lws_inform_client_conn_fail(wsi, "Closed before conn", 18);
782 && !wsi->close_is_redirect
786 if (!wsi->a.protocol && wsi->a.vhost && wsi->a.vhost->protocols)
787 pro = &wsi->a.vhost->protocols[0];
790 pro->callback(wsi,
791 wsi->role_ops->close_cb[lwsi_role_server(wsi)],
792 wsi->user_space, NULL, 0);
793 wsi->told_user_closed = 1;
801 if (wsi->for_ss) {
802 lwsl_wsi_debug(wsi, "for_ss");
811 if (wsi->client_proxy_onward) {
813 * We are an onward proxied wsi at the proxy,
817 lws_proxy_clean_conn_ss(wsi);
820 if (wsi->client_bound_sspc) {
821 lws_sspc_handle_t *h = (lws_sspc_handle_t *)wsi->a.opaque_user_data;
833 //wsi->a.opaque_user_data = NULL;
838 lws_ss_handle_t *h = (lws_ss_handle_t *)wsi->a.opaque_user_data;
846 lws_metrics_caliper_report_hist(h->cal_txn, wsi);
848 h->wsi = NULL;
849 wsi->a.opaque_user_data = NULL;
863 lws_remove_child_from_any_parent(wsi);
864 wsi->socket_is_permanently_unusable = 1;
866 if (wsi->a.context->event_loop_ops->wsi_logical_close)
867 if (wsi->a.context->event_loop_ops->wsi_logical_close(wsi))
870 __lws_close_free_wsi_final(wsi);
877 __lws_close_free_wsi_final(struct lws *wsi)
881 if (!wsi->shadow &&
882 lws_socket_is_valid(wsi->desc.sockfd) && !lws_ssl_close(wsi)) {
883 lwsl_wsi_debug(wsi, "fd %d", wsi->desc.sockfd);
884 n = compatible_close(wsi->desc.sockfd);
886 lwsl_wsi_debug(wsi, "closing: close ret %d", LWS_ERRNO);
888 __remove_wsi_socket_from_fds(wsi);
889 if (lws_socket_is_valid(wsi->desc.sockfd))
890 delete_from_fd(wsi->a.context, wsi->desc.sockfd);
893 delete_from_fdwsi(wsi->a.context, wsi);
896 sanity_assert_no_sockfd_traces(wsi->a.context, wsi->desc.sockfd);
903 &wsi->a.context->pt[(int)wsi->tsi];
905 if (pt->pipe_wsi == wsi)
907 if (pt->dummy_pipe_fds[0] == wsi->desc.sockfd)
911 wsi->desc.sockfd = LWS_SOCK_INVALID;
914 lws_free_set_NULL(wsi->cli_hostname_copy);
915 if (wsi->close_is_redirect) {
917 wsi->close_is_redirect = 0;
919 lwsl_wsi_info(wsi, "picking up redirection");
921 lws_role_transition(wsi, LWSIFR_CLIENT, LRS_UNCONNECTED,
925 if (wsi->client_mux_substream_was)
926 wsi->h2.END_STREAM = wsi->h2.END_HEADERS = 0;
929 if (wsi->mux.parent_wsi) {
930 lws_wsi_mux_sibling_disconnect(wsi);
931 wsi->mux.parent_wsi = NULL;
936 memset(&wsi->tls, 0, sizeof(wsi->tls));
939 // wsi->a.protocol = NULL;
940 if (wsi->a.protocol)
941 lws_bind_protocol(wsi, wsi->a.protocol, "client_reset");
942 wsi->pending_timeout = NO_PENDING_TIMEOUT;
943 wsi->hdr_parsing_completed = 0;
946 if (wsi->stash->cis[CIS_ALPN])
947 lws_strncpy(wsi->alpn, wsi->stash->cis[CIS_ALPN],
948 sizeof(wsi->alpn));
951 if (lws_header_table_attach(wsi, 0)) {
952 lwsl_wsi_err(wsi, "failed to get ah");
956 //_lws_header_table_reset(wsi->http.ah);
959 wsi->tls.use_ssl = (unsigned int)wsi->flags;
963 if (wsi->stash && wsi->stash->cis[CIS_ADDRESS]) {
965 lws_tls_jit_trust_vhost_bind(wsi->a.context,
966 wsi->stash->cis[CIS_ADDRESS],
970 lwsl_wsi_info(wsi, "%s in use\n",
975 wsi->a.vhost = vh;
984 /* outermost destroy notification for wsi (user_space still intact) */
985 if (wsi->a.vhost)
986 wsi->a.vhost->protocols[0].callback(wsi, LWS_CALLBACK_WSI_DESTROY,
987 wsi->user_space, NULL, 0);
990 if (wsi->http.cgi) {
991 lws_spawn_piped_destroy(&wsi->http.cgi->lsp);
992 lws_sul_cancel(&wsi->http.cgi->sul_grace);
993 lws_free_set_NULL(wsi->http.cgi);
998 lws_fi_destroy(&wsi->fic);
1001 __lws_wsi_remove_from_sul(wsi);
1002 sanity_assert_no_wsi_traces(wsi->a.context, wsi);
1003 __lws_free_wsi(wsi);
1008 lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char *caller)
1010 struct lws_context *cx = wsi->a.context;
1011 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
1017 __lws_close_free_wsi(wsi, reason, caller);