Lines Matching refs:wsi
42 lws_read_h1(struct lws *wsi, unsigned char *buf, lws_filepos_t len)
48 lwsl_debug("%s: h1 path: wsi state 0x%x\n", __func__, lwsi_state(wsi));
50 switch (lwsi_state(wsi)) {
57 if (lwsi_role_ws(wsi))
60 if (lwsi_role_client(wsi))
63 wsi->hdr_parsing_completed = 0;
68 if (!wsi->http.ah) {
74 if (lws_ws_handshake_client(wsi, &buf, (size_t)len))
78 if (lws_handshake_server(wsi, &buf, (size_t)len))
83 if (wsi->role_ops == &role_ops_raw_skt
86 wsi->role_ops == &role_ops_raw_file
101 if (!wsi->hdr_parsing_completed)
105 switch (lwsi_state(wsi)) {
113 wsi->http.rx_content_remain =
114 wsi->http.rx_content_length;
115 if (wsi->http.rx_content_remain)
129 (int)wsi->http.content_length_given,
130 (int)wsi->http.rx_content_remain, (int)len);
132 if (wsi->http.content_length_given && !wsi->http.rx_content_remain)
135 while (len && (!wsi->http.content_length_given || wsi->http.rx_content_remain)) {
140 if (wsi->http.content_length_given)
141 body_chunk_len = min(wsi->http.rx_content_remain, len);
144 wsi->http.rx_content_remain -= body_chunk_len;
147 if (wsi->http.cgi) {
151 args.stdwsi = &wsi->http.cgi->lsp->stdwsi[0];
157 wsi->a.protocol->callback,
158 wsi, LWS_CALLBACK_CGI_STDIN_DATA,
159 wsi->user_space,
165 if (lwsi_state(wsi) != LRS_DISCARD_BODY) {
167 n = (unsigned int)wsi->a.protocol->callback(wsi,
168 LWS_CALLBACK_HTTP_BODY, wsi->user_space,
181 if (lwsi_role_h2(wsi) && !wsi->http.content_length_given) {
182 struct lws *w = lws_get_network_wsi(wsi);
190 lws_set_timeout(wsi,
192 (int)wsi->a.context->timeout_secs);
199 if (wsi->http.rx_content_remain) {
200 lws_set_timeout(wsi,
202 (int)wsi->a.context->timeout_secs);
212 if (wsi->http.cgi)
213 lws_set_timeout(wsi, PENDING_TIMEOUT_CGI,
214 (int)wsi->a.context->timeout_secs);
217 lws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);
219 if (!wsi->http.cgi)
223 if (lwsi_state(wsi) == LRS_DISCARD_BODY) {
230 if (lws_http_transaction_completed(wsi))
236 lws_wsi_tag(wsi), wsi->a.protocol->name);
238 n = (unsigned int)wsi->a.protocol->callback(wsi,
240 wsi->user_space, NULL, 0);
246 if (wsi->mux_substream)
247 lwsi_set_state(wsi, LRS_ESTABLISHED);
262 if (lws_ws_handshake_client(wsi, &buf, (size_t)len))
266 if (lwsi_role_ws(wsi) && lwsi_role_server(wsi) &&
270 lws_parse_ws(wsi, &buf, (size_t)len) < 0) {
299 lwsl_err("%s: Unhandled state %d\n", __func__, lwsi_state(wsi));
306 // wsi, (long)(buf - oldbuf), (int)len, wsi->state);
321 * outer lws_read() does the wsi close.
323 if (!wsi->outer_will_close)
324 lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS,
331 lws_h1_server_socket_service(struct lws *wsi, struct lws_pollfd *pollfd)
333 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
337 if (lwsi_state(wsi) == LRS_DEFERRING_ACTION)
352 if (wsi->favoured_pollin &&
355 wsi->favoured_pollin = 0;
364 if (lwsi_state(wsi) == LRS_SSL_ACK_PENDING)
369 if ((lwsi_state(wsi) == LRS_ESTABLISHED ||
370 lwsi_state(wsi) == LRS_ISSUING_FILE ||
371 lwsi_state(wsi) == LRS_HEADERS ||
372 lwsi_state(wsi) == LRS_DOING_TRANSACTION || /* at least, SSE */
373 lwsi_state(wsi) == LRS_DISCARD_BODY ||
374 lwsi_state(wsi) == LRS_BODY)) {
376 if (!wsi->http.ah && lws_header_table_attach(wsi, 0)) {
378 lws_wsi_tag(wsi));
394 buffered = lws_buflist_aware_read(pt, wsi, &ebuf, 0, __func__);
398 wsi->seen_zero_length_recv = 1;
399 if (lws_change_pollfd(wsi, LWS_POLLIN, 0))
406 if (wsi->ws &&
407 (wsi->ws->rx_draining_ext ||
408 wsi->ws->tx_draining_ext))
424 if (lwsi_state(wsi) == LRS_FLUSHING_BEFORE_CLOSE) {
429 if (lwsi_state(wsi) == LRS_ISSUING_FILE) {
430 // lwsl_notice("stashing: wsi %p: bd %d\n", wsi, buffered);
431 if (lws_buflist_aware_finished_consuming(wsi, &ebuf, 0,
443 if (lwsi_role_h2(wsi) && lwsi_state(wsi) != LRS_BODY)
444 n = lws_read_h2(wsi, ebuf.token, (unsigned int)ebuf.len);
447 n = lws_read_h1(wsi, ebuf.token, (unsigned int)ebuf.len);
448 if (n < 0) /* we closed wsi */
453 if (lws_buflist_aware_finished_consuming(wsi, &ebuf, n,
462 if (wsi->http.ah &&
463 !lwsi_role_h1(wsi) &&
464 !lwsi_role_h2(wsi) &&
465 !lwsi_role_cgi(wsi))
466 lws_header_table_detach(wsi, 0);
474 wsi->favoured_pollin = 1;
485 wsi->favoured_pollin = 1;
495 if (lws_change_pollfd(wsi, LWS_POLLOUT, 0)) {
501 wsi->could_have_pending = 0;
503 if (lwsi_state(wsi) == LRS_DEFERRING_ACTION) {
506 lwsi_set_state(wsi, LRS_ESTABLISHED);
507 if (lws_change_pollfd(wsi, LWS_POLLOUT, 0)) {
513 if (!wsi->hdr_parsing_completed)
516 if (lwsi_state(wsi) != LRS_ISSUING_FILE) {
518 if (lws_has_buffered_out(wsi)) {
520 if (lws_issue_raw(wsi, NULL, 0) < 0) {
527 n = user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
529 wsi->user_space, NULL, 0);
546 n = lws_serve_http_file_fragment(wsi);
555 lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS,
563 rops_handle_POLLIN_h1(struct lws_context_per_thread *pt, struct lws *wsi,
566 if (lwsi_state(wsi) == LRS_IDLING) {
577 // __func__, wsi, wsi->wsistate, wsi->role_ops->name,
580 rlen = lws_ssl_capable_read(wsi, buf, sizeof(buf));
586 if (wsi->http.cgi && (pollfd->revents & LWS_POLLOUT)) {
587 if (lws_handle_POLLOUT_event(wsi, pollfd))
597 if (wsi->http.comp_ctx.buflist_comp ||
598 wsi->http.comp_ctx.may_have_more) {
602 __func__, wsi->http.comp_ctx.buflist_comp,
603 wsi->http.comp_ctx.may_have_more
606 if (lws_rops_fidx(wsi->role_ops, LWS_ROPS_write_role_protocol) &&
607 lws_rops_func_fidx(wsi->role_ops, LWS_ROPS_write_role_protocol).
608 write_role_protocol(wsi, NULL, 0, &wp) < 0) {
612 lws_callback_on_writable(wsi);
614 if (!wsi->http.comp_ctx.buflist_comp &&
615 !wsi->http.comp_ctx.may_have_more &&
616 wsi->http.deferred_transaction_completed) {
617 wsi->http.deferred_transaction_completed = 0;
618 if (lws_http_transaction_completed(wsi))
626 if (lws_is_flowcontrolled(wsi))
633 if (!lwsi_role_client(wsi)) {
636 lwsl_debug("%s: %s: wsistate 0x%x\n", __func__, lws_wsi_tag(wsi),
637 (unsigned int)wsi->wsistate);
640 !lws_buflist_total_len(&wsi->buflist))
643 n = lws_h1_server_socket_service(wsi, pollfd);
646 if (lwsi_state(wsi) != LRS_SSL_INIT)
647 if (lws_server_socket_service_ssl(wsi,
658 wsi->hdr_parsing_completed && !wsi->told_user_closed) {
671 wsi->client_rx_avail = 1;
672 if (lws_change_pollfd(wsi, LWS_POLLIN, 0))
675 //lwsl_notice("calling back %s\n", wsi->a.protocol->name);
680 if (user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
682 wsi->user_space, NULL, 0)) {
691 // if (lwsi_state(wsi) == LRS_ESTABLISHED)
696 lws_handle_POLLOUT_event(wsi, pollfd)) {
701 if (lws_http_client_socket_service(wsi, pollfd))
705 if (lwsi_state(wsi) == LRS_WAITING_CONNECT &&
713 rops_handle_POLLOUT_h1(struct lws *wsi)
717 if (lwsi_state(wsi) == LRS_ISSUE_HTTP_BODY ||
718 lwsi_state(wsi) == LRS_WAITING_SERVER_REPLY) {
720 if (wsi->http.proxy_clientside) {
723 &wsi->parent->http.buflist_post_body, &buf);
733 __func__, lws_wsi_tag(wsi), (int)len,
734 (int)wsi->http.tx_content_length,
735 (int)wsi->http.tx_content_remain,
736 (int)wsi->http.rx_content_length,
737 (int)wsi->http.rx_content_remain
740 n = lws_write(wsi, prebuf + LWS_PRE, len, LWS_WRITE_HTTP);
747 lws_buflist_use_segment(&wsi->parent->http.buflist_post_body, len);
751 if (wsi->parent->http.buflist_post_body) {
752 lws_callback_on_writable(wsi);
756 lwsl_wsi_err(wsi, "nothing to send");
759 wsi->http.ah->parser_state = WSI_TOKEN_NAME_PART;
760 wsi->http.ah->lextable_pos = 0;
762 wsi->http.ah->unk_pos = 0;
765 lwsi_set_state(wsi, LRS_WAITING_SERVER_REPLY);
766 lws_set_timeout(wsi, PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE,
767 (int)wsi->a.context->timeout_secs);
775 if (lwsi_role_client(wsi))
782 rops_write_role_protocol_h1(struct lws *wsi, unsigned char *buf, size_t len,
789 if (wsi->http.lcs && (((*wp) & 0x1f) == LWS_WRITE_HTTP_FINAL ||
800 n = lws_http_compression_transform(wsi, buf, len, wp, &out, &o);
806 lws_wsi_tag(wsi), (int)len,
807 (int)o, (int)*wp, wsi->http.comp_ctx.may_have_more);
812 if (wsi->http.comp_ctx.chunking) {
841 n = lws_issue_raw(wsi, (unsigned char *)buf, len);
851 rops_alpn_negotiated_h1(struct lws *wsi, const char *alpn)
853 lwsl_debug("%s: client %d\n", __func__, lwsi_role_client(wsi));
855 if (lwsi_role_client(wsi)) {
863 wsi->keepalive_active = 1;
871 rops_destroy_role_h1(struct lws *wsi)
873 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
878 __lws_header_table_detach(wsi, 0);
883 if (ah->in_use && ah->wsi == wsi) {
884 lwsl_err("%s: ah leak: wsi %s\n", __func__,
885 lws_wsi_tag(wsi));
887 ah->wsi = NULL;
895 lws_http_compression_destroy(wsi);
899 lws_free_set_NULL(wsi->ws);
907 rops_adoption_bind_h1(struct lws *wsi, int type, const char *vh_prot_name)
912 if (type & _LWS_ADOPT_FINISH && !lwsi_role_http(wsi))
916 if (!lws_header_table_attach(wsi, 0))
925 if (wsi->a.vhost->ss_handle &&
926 wsi->a.vhost->ss_handle->policy->protocol == LWSSSP_RAW) {
927 lws_role_transition(wsi, LWSIFR_SERVER, (type & LWS_ADOPT_ALLOW_SSL) ?
936 if ((!(type & LWS_ADOPT_ALLOW_SSL)) && (wsi->a.vhost->options & LWS_SERVER_OPTION_H2_PRIOR_KNOWLEDGE)) {
938 lws_metrics_tag_wsi_add(wsi, "upg", "h2_prior");
939 lws_role_call_alpn_negotiated(wsi, "h2");
943 lws_role_transition(wsi, LWSIFR_SERVER, (type & LWS_ADOPT_ALLOW_SSL) ?
952 if (!vh_prot_name && wsi->a.vhost->default_protocol_index <
953 wsi->a.vhost->count_protocols)
954 wsi->a.protocol = &wsi->a.vhost->protocols[
955 wsi->a.vhost->default_protocol_index];
957 wsi->a.protocol = &wsi->a.vhost->protocols[0];
960 lws_set_timeout(wsi, PENDING_TIMEOUT_ESTABLISH_WITH_SERVER,
961 (int)wsi->a.context->timeout_secs);
975 rops_client_bind_h1(struct lws *wsi, const struct lws_client_connect_info *i)
988 if (!wsi->user_space && wsi->stash->cis[CIS_METHOD])
989 if (lws_ensure_user_space(wsi))
1002 if (!wsi->stash->cis[CIS_METHOD] && !wsi->stash->cis[CIS_ALPN])
1003 wsi->stash->cis[CIS_ALPN] = "http/1.1";
1010 if (lws_header_table_attach(wsi, 0)
1037 if (lws_create_client_ws_object(i, wsi))
1060 lws_role_transition(wsi, LWSIFR_CLIENT, LRS_UNCONNECTED, &role_ops_h1);
1070 rops_close_kill_connection_h1(struct lws *wsi, enum lws_close_status reason)
1073 if (!wsi->http.proxy_clientside)
1076 wsi->http.proxy_clientside = 0;
1078 if (user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
1080 wsi->user_space, NULL, 0))