Lines Matching refs:wsi

31 lws_extension_server_handshake(struct lws *wsi, char **p, int budget)
33 struct lws_context *context = wsi->a.context;
34 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
48 if (!lws_hdr_total_length(wsi, WSI_TOKEN_EXTENSIONS))
56 if (lws_hdr_copy(wsi, (char *)pt->serv_buf, (int)context->pt_serv_buf_size,
62 wsi->ws->count_act_ext = 0;
115 ext = wsi->a.vhost->ws.extensions;
128 for (m = 0; m < wsi->ws->count_act_ext; m++)
129 if (wsi->ws->active_extensions[m] == ext) {
138 m = (wsi->a.protocol->callback)(wsi,
140 wsi->user_space, ext_name, 0);
158 wsi->ws->active_extensions[wsi->ws->count_act_ext] = ext;
162 if (ext->callback(lws_get_context(wsi), ext, wsi,
164 (void *)&wsi->ws->act_ext_user[
165 wsi->ws->count_act_ext],
214 if (!ext->callback(lws_get_context(wsi),
215 ext, wsi,
217 wsi->ws->act_ext_user[
218 wsi->ws->count_act_ext],
236 wsi->ws->count_act_ext++;
238 wsi->ws->count_act_ext);
255 lws_process_ws_upgrade2(struct lws *wsi)
257 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
264 * Allow basic auth a look-in now we bound the wsi to the protocol.
271 pvos = lws_vhost_protocol_options(wsi->a.vhost, wsi->a.protocol->name);
276 switch (lws_check_basic_auth(wsi, ws_prot_basic_auth, LWSAUTHM_DEFAULT
281 return lws_unauthorised_basic_auth(wsi);
283 lws_return_http_status(wsi, HTTP_STATUS_FORBIDDEN, NULL);
284 return lws_http_transaction_completed(wsi);
304 if (!wsi->h2_stream_carries_ws) {
305 lws_role_transition(wsi, LWSIFR_SERVER, LRS_ESTABLISHED,
314 if (wsi->a.vhost->ss_handle) {
316 __func__, lws_ss_tag(wsi->a.vhost->ss_handle));
317 wsi->a.protocol = &protocol_secstream_ws;
325 (void)lws_ss_event_helper(wsi->a.vhost->ss_handle,
333 /* allocate the ws struct for the wsi */
335 wsi->ws = lws_zalloc(sizeof(*wsi->ws), "ws struct");
336 if (!wsi->ws) {
341 if (lws_hdr_total_length(wsi, WSI_TOKEN_VERSION))
342 wsi->ws->ietf_spec_revision = (uint8_t)
343 atoi(lws_hdr_simple_ptr(wsi, WSI_TOKEN_VERSION));
345 /* allocate wsi->user storage */
346 if (lws_ensure_user_space(wsi)) {
355 if ((wsi->a.protocol->callback)(wsi,
357 wsi->user_space,
358 lws_hdr_simple_ptr(wsi, WSI_TOKEN_PROTOCOL), 0)) {
368 switch (wsi->ws->ietf_spec_revision) {
371 wsi->ws->ietf_spec_revision);
372 wsi->ws->ietf_spec_revision = 13;
377 if (wsi->h2_stream_carries_ws) {
378 if (lws_h2_ws_handshake(wsi)) {
382 lws_role_transition(wsi,
392 lws_sul_cancel(&wsi->sul_validity);
397 if (handshake_0405(wsi->a.context, wsi)) {
405 if (lws_server_init_wsi_for_ws(wsi)) {
409 lwsl_parser("accepted v%02d connection\n", wsi->ws->ietf_spec_revision);
414 int l = 14, meth = lws_http_get_uri_and_method(wsi, &uptr, &l);
416 if (wsi->h2_stream_carries_ws)
417 wsi->http.request_version = HTTP_VERSION_2;
419 wsi->http.access_log.response = 101;
423 wsi->a.protocol->name);
427 lws_prepare_access_log_info(wsi, combo, l, meth);
428 lws_access_log(wsi);
432 lwsl_info("%s: %s: dropping ah on ws upgrade\n", __func__, lws_wsi_tag(wsi));
433 lws_header_table_detach(wsi, 1);
439 lws_process_ws_upgrade(struct lws *wsi)
447 if (!wsi->a.protocol)
458 if (!wsi->mux_substream) {
465 n = lws_hdr_copy(wsi, buf, sizeof(buf) - 1, WSI_TOKEN_CONNECTION);
500 meth = lws_http_get_uri_and_method(wsi, &uri_ptr, &uri_len);
501 hit = lws_find_mount(wsi, uri_ptr, uri_len);
519 return lws_http_proxy_start(wsi, hit, uri_ptr, 1);
532 n = lws_hdr_copy(wsi, buf, sizeof(buf) - 1, WSI_TOKEN_PROTOCOL);
539 int n = wsi->a.vhost->default_protocol_index;
550 if (n >= wsi->a.vhost->count_protocols) {
559 lws_bind_protocol(wsi, &wsi->a.vhost->protocols[n],
566 if (wsi->a.vhost->ss_handle) {
567 lws_ss_handle_t *sssh = wsi->a.vhost->ss_handle;
581 pcol = lws_vhost_name_to_protocol(wsi->a.vhost,
584 lws_bind_protocol(wsi, pcol, "ss ws upg pcol");
605 pcol = lws_vhost_name_to_protocol(wsi->a.vhost, name);
608 lws_bind_protocol(wsi, pcol, "ws upg pcol");
634 return lws_process_ws_upgrade2(wsi);
638 handshake_0405(struct lws_context *context, struct lws *wsi)
640 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
647 if (!lws_hdr_total_length(wsi, WSI_TOKEN_HOST) ||
648 !lws_hdr_total_length(wsi, WSI_TOKEN_KEY)) {
654 if (lws_hdr_total_length(wsi, WSI_TOKEN_KEY) >=
666 lws_hdr_simple_ptr(wsi, WSI_TOKEN_KEY));
678 if (lws_ensure_user_space(wsi))
697 if (lws_hdr_total_length(wsi, WSI_TOKEN_PROTOCOL) &&
699 wsi->a.protocol->name &&
700 wsi->a.protocol->name[0]) {
701 const char *prot = wsi->a.protocol->name;
704 if (wsi->proxied_ws_parent && wsi->child_list)
705 prot = wsi->child_list->ws->actual_protocol;
710 lws_ss_handle_t *sssh = wsi->a.vhost->ss_handle;
740 if (lws_extension_server_handshake(wsi, &p, 192))
748 if (user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
750 wsi->user_space, &args, 0))
766 n = lws_write(wsi, (unsigned char *)response, lws_ptr_diff_size_t(p, response),
775 lwsi_set_state(wsi, LRS_ESTABLISHED);
776 wsi->lws_rx_parse_state = LWS_RXPS_NEW;
780 lws_hdr_simple_ptr(wsi, WSI_TOKEN_GET_URI);
781 int uri_len = lws_hdr_total_length(wsi, WSI_TOKEN_GET_URI);
783 lws_find_mount(wsi, uri_ptr, uri_len);
785 wsi->a.protocol->callback(wsi, LWS_CALLBACK_HTTP_PMO,
786 wsi->user_space, (void *)hit->cgienv, 0))
805 lws_ws_frame_rest_is_payload(struct lws *wsi, uint8_t **buf, size_t len)
811 unsigned int old_packet_length = (unsigned int)wsi->ws->rx_packet_length;
824 if (!wsi->ws->count_act_ext)
827 if (wsi->a.protocol->rx_buffer_size)
828 avail = (unsigned int)wsi->a.protocol->rx_buffer_size;
830 avail = wsi->a.context->pt_serv_buf_size;
834 if (avail > wsi->ws->rx_packet_length)
835 avail = (unsigned int)wsi->ws->rx_packet_length;
849 if (!wsi->ws->all_zero_nonce) {
852 mask[n] = wsi->ws->mask[(wsi->ws->mask_idx + n) & 3];
872 wsi->ws->mask_idx = (wsi->ws->mask_idx + avail) & 3;
880 wsi->ws->rx_packet_length -= avail;
883 n = lws_ext_cb_active(wsi, LWS_EXT_CB_PAYLOAD_RX, &pmdrx, 0);
897 wsi->socket_is_permanently_unusable = 1;
915 !wsi->ws->rx_packet_length && /* raw ws packet payload all gone */
916 wsi->ws->final && /* the raw ws packet is a FIN guy */
917 wsi->a.protocol->callback &&
918 !wsi->wsistate_pre_close) {
922 if (user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
924 wsi->user_space, NULL, 0))
934 if (wsi->ws->count_act_ext && !pmdrx.eb_out.len)
939 lws_add_wsi_to_draining_ext_list(wsi);
941 lws_remove_wsi_from_draining_ext_list(wsi);
945 wsi->ws->check_utf8 && !wsi->ws->defeat_check_utf8) {
946 if (lws_check_utf8(&wsi->ws->utf8,
949 lws_close_reason(wsi, LWS_CLOSE_STATUS_INVALID_PAYLOAD,
955 if (!wsi->ws->rx_packet_length && wsi->ws->final &&
956 wsi->ws->utf8 && !n) {
958 lws_close_reason(wsi, LWS_CLOSE_STATUS_INVALID_PAYLOAD,
969 if (wsi->a.protocol->callback && !wsi->wsistate_pre_close)
970 if (user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
972 wsi->user_space,
977 wsi->ws->first_fragment = 0;
982 wsi->ws->rx_draining_ext);
990 lws_parse_ws(struct lws *wsi, unsigned char **buf, size_t len)
1005 if (wsi->rxflow_bitmap) {
1017 if (lws_rxflow_cache(wsi, *buf, 0, len) ==
1034 if (wsi->ws->rx_draining_ext) {
1036 m = lws_ws_rx_sm(wsi, ALREADY_PROCESSED_IGNORE_CHAR, 0);
1044 while (wsi->lws_rx_parse_state == LWS_RXPS_WS_FRAME_PAYLOAD &&
1045 (wsi->ws->opcode == LWSWSOPC_TEXT_FRAME ||
1046 wsi->ws->opcode == LWSWSOPC_BINARY_FRAME ||
1047 wsi->ws->opcode == LWSWSOPC_CONTINUATION) &&
1052 m = lws_ws_frame_rest_is_payload(wsi, buf, len);
1069 m = lws_ws_rx_sm(wsi, 0, *(*buf)++);
1078 "wsi->ws->rx_draining_ext %d\n",
1080 wsi->ws->rx_draining_ext);
1082 m = lws_ws_rx_sm(wsi, ALREADY_PROCESSED_IGNORE_CHAR |