Lines Matching refs:wsi

109 __lws_header_table_reset(struct lws *wsi, int autoservice)
111 struct allocated_headers *ah = wsi->http.ah;
118 assert(ah->wsi == wsi);
123 wsi->hdr_parsing_completed = 0;
125 /* while we hold the ah, keep a timeout on the wsi */
126 __lws_set_timeout(wsi, PENDING_TIMEOUT_HOLDING_AH,
127 wsi->a.vhost->timeout_secs_ah_idle);
131 if (wsi->position_in_fds_table != LWS_NO_FDS_POS &&
132 lws_buflist_next_segment_len(&wsi->buflist, NULL) &&
136 pt = &wsi->a.context->pt[(int)wsi->tsi];
141 pfd = &pt->fds[wsi->position_in_fds_table];
144 lws_service_fd_tsi(wsi->a.context, pfd, wsi->tsi);
149 lws_header_table_reset(struct lws *wsi, int autoservice)
151 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
155 __lws_header_table_reset(wsi, autoservice);
161 _lws_header_ensure_we_are_on_waiting_list(struct lws *wsi)
163 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
168 if (*pwsi == wsi)
173 lwsl_info("%s: wsi: %s\n", __func__, lws_wsi_tag(wsi));
174 wsi->http.ah_wait_list = pt->http.ah_wait_list;
175 pt->http.ah_wait_list = wsi;
180 _lws_change_pollfd(wsi, LWS_POLLIN, 0, &pa);
184 __lws_remove_from_ah_waiting_list(struct lws *wsi)
186 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
190 if (*pwsi == wsi) {
191 lwsl_info("%s: wsi %s\n", __func__, lws_wsi_tag(wsi));
193 *pwsi = wsi->http.ah_wait_list;
195 wsi->http.ah_wait_list = NULL;
207 lws_header_table_attach(struct lws *wsi, int autoservice)
209 struct lws_context *context = wsi->a.context;
210 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
215 if (lwsi_role_mqtt(wsi))
220 lws_wsi_tag(wsi), (void *)wsi->http.ah, wsi->tsi,
223 if (!lwsi_role_http(wsi)) {
224 lwsl_err("%s: bad role %s\n", __func__, wsi->role_ops->name);
232 if (wsi->http.ah) {
240 n = lws_peer_confirm_ah_attach_ok(context, wsi->peer);
250 _lws_header_ensure_we_are_on_waiting_list(wsi);
255 __lws_remove_from_ah_waiting_list(wsi);
257 wsi->http.ah = _lws_create_ah(pt, context->max_http_header_data);
258 if (!wsi->http.ah) { /* we could not create an ah */
259 _lws_header_ensure_we_are_on_waiting_list(wsi);
264 wsi->http.ah->in_use = 1;
265 wsi->http.ah->wsi = wsi; /* mark our owner */
271 if (wsi->peer)
272 wsi->peer->http.count_ah++;
276 _lws_change_pollfd(wsi, 0, LWS_POLLIN, &pa);
278 lwsl_info("%s: did attach wsi %s: ah %p: count %d (on exit)\n", __func__,
279 lws_wsi_tag(wsi), (void *)wsi->http.ah, pt->http.ah_count_in_use);
282 __lws_header_table_reset(wsi, autoservice);
290 if (lwsi_role_client(wsi) && lwsi_state(wsi) == LRS_UNCONNECTED)
291 if (!lws_http_client_connect_via_info2(wsi))
292 /* our client connect has failed, the wsi
306 int __lws_header_table_detach(struct lws *wsi, int autoservice)
308 struct lws_context *context = wsi->a.context;
309 struct allocated_headers *ah = wsi->http.ah;
310 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
315 __lws_remove_from_ah_waiting_list(wsi);
321 lws_wsi_tag(wsi), (void *)ah, wsi->tsi,
332 "\n", __func__, lws_wsi_tag(wsi),
334 (unsigned long)lwsi_role(wsi), lwsi_state(wsi));
343 memset(&wsi->http.ah, 0, sizeof(wsi->http.ah));
346 if (ah->wsi)
347 lws_peer_track_ah_detach(context, wsi->peer);
349 ah->wsi = NULL; /* no owner */
350 wsi->http.ah = NULL;
359 * at least one wsi on the same tsi is waiting, give it to oldest guy
363 wsi = NULL;
372 wsi = *pwsi;
379 if (!wsi) /* everybody waiting already has too many ah... */
382 lwsl_info("%s: transferring ah to last eligible wsi in wait list "
383 "%s (wsistate 0x%lx)\n", __func__, lws_wsi_tag(wsi),
384 (unsigned long)wsi->wsistate);
386 wsi->http.ah = ah;
387 ah->wsi = wsi; /* new owner */
389 __lws_header_table_reset(wsi, autoservice);
393 if (wsi->peer)
394 wsi->peer->http.count_ah++;
399 if (wsi->position_in_fds_table != LWS_NO_FDS_POS) {
400 lwsl_info("%s: Enabling %s POLLIN\n", __func__, lws_wsi_tag(wsi));
405 _lws_change_pollfd(wsi, 0, LWS_POLLIN, &pa);
409 *pwsi_eligible = wsi->http.ah_wait_list;
411 wsi->http.ah_wait_list = NULL;
415 if (lwsi_role_client(wsi) && lwsi_state(wsi) == LRS_UNCONNECTED) {
418 if (!lws_http_client_connect_via_info2(wsi)) {
419 /* our client connect has failed, the wsi
433 lws_wsi_tag(wsi), (void *)ah, pt->tid, pt->http.ah_count_in_use);
445 int lws_header_table_detach(struct lws *wsi, int autoservice)
447 struct lws_context *context = wsi->a.context;
448 struct lws_context_per_thread *pt = &context->pt[(int)wsi->tsi];
452 n = __lws_header_table_detach(wsi, autoservice);
459 lws_hdr_fragment_length(struct lws *wsi, enum lws_token_indexes h, int frag_idx)
463 if (!wsi->http.ah)
466 n = wsi->http.ah->frag_index[h];
471 return wsi->http.ah->frags[n].len;
472 n = wsi->http.ah->frags[n].nfrag;
478 int lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h)
483 if (!wsi->http.ah)
486 n = wsi->http.ah->frag_index[h];
490 len += wsi->http.ah->frags[n].len;
491 n = wsi->http.ah->frags[n].nfrag;
501 int lws_hdr_copy_fragment(struct lws *wsi, char *dst, int len,
507 if (!wsi->http.ah)
510 f = wsi->http.ah->frag_index[h];
516 f = wsi->http.ah->frags[f].nfrag;
522 if (wsi->http.ah->frags[f].len >= len)
525 memcpy(dst, wsi->http.ah->data + wsi->http.ah->frags[f].offset,
526 wsi->http.ah->frags[f].len);
527 dst[wsi->http.ah->frags[f].len] = '\0';
529 return wsi->http.ah->frags[f].len;
532 int lws_hdr_copy(struct lws *wsi, char *dst, int len,
535 int toklen = lws_hdr_total_length(wsi, h), n, comma;
544 if (!wsi->http.ah)
547 n = wsi->http.ah->frag_index[h];
551 comma = (wsi->http.ah->frags[n].nfrag) ? 1 : 0;
555 __func__, (int)wsi->http.ah->frags[n].len,
556 &wsi->http.ah->data[
557 wsi->http.ah->frags[n].offset]);
559 if (wsi->http.ah->frags[n].len + comma >= len) {
563 strncpy(dst, &wsi->http.ah->data[wsi->http.ah->frags[n].offset],
564 wsi->http.ah->frags[n].len);
565 dst += wsi->http.ah->frags[n].len;
566 len -= wsi->http.ah->frags[n].len;
567 n = wsi->http.ah->frags[n].nfrag;
598 lws_hdr_custom_length(struct lws *wsi, const char *name, int nlen)
602 if (!wsi->http.ah || wsi->mux_substream)
605 ll = wsi->http.ah->unk_ll_head;
607 if (ll >= wsi->http.ah->data_length)
610 (uint8_t *)&wsi->http.ah->data[ll + UHO_NLEN]) &&
611 !strncmp(name, &wsi->http.ah->data[ll + UHO_NAME], (unsigned int)nlen))
613 (uint8_t *)&wsi->http.ah->data[ll + UHO_VLEN]);
615 ll = lws_ser_ru32be((uint8_t *)&wsi->http.ah->data[ll + UHO_LL]);
622 lws_hdr_custom_copy(struct lws *wsi, char *dst, int len, const char *name,
628 if (!wsi->http.ah || wsi->mux_substream)
633 ll = wsi->http.ah->unk_ll_head;
635 if (ll >= wsi->http.ah->data_length)
638 (uint8_t *)&wsi->http.ah->data[ll + UHO_NLEN]) &&
639 !strncmp(name, &wsi->http.ah->data[ll + UHO_NAME], (unsigned int)nlen)) {
641 (uint8_t *)&wsi->http.ah->data[ll + UHO_VLEN]);
644 strncpy(dst, &wsi->http.ah->data[ll + UHO_NAME + (unsigned int)nlen], (unsigned int)n);
649 ll = lws_ser_ru32be((uint8_t *)&wsi->http.ah->data[ll + UHO_LL]);
656 lws_hdr_custom_name_foreach(struct lws *wsi, lws_hdr_custom_fe_cb_t cb,
661 if (!wsi->http.ah || wsi->mux_substream)
664 ll = wsi->http.ah->unk_ll_head;
667 if (ll >= wsi->http.ah->data_length)
670 cb(&wsi->http.ah->data[ll + UHO_NAME],
671 lws_ser_ru16be((uint8_t *)&wsi->http.ah->data[ll + UHO_NLEN]),
674 ll = lws_ser_ru32be((uint8_t *)&wsi->http.ah->data[ll + UHO_LL]);
681 char *lws_hdr_simple_ptr(struct lws *wsi, enum lws_token_indexes h)
685 if (!wsi->http.ah)
688 n = wsi->http.ah->frag_index[h];
692 return wsi->http.ah->data + wsi->http.ah->frags[n].offset;
696 lws_pos_in_bounds(struct lws *wsi)
698 if (!wsi->http.ah)
701 if (wsi->http.ah->pos <
702 (unsigned int)wsi->a.context->max_http_header_data)
705 if ((int)wsi->http.ah->pos >= (int)wsi->a.context->max_http_header_data - 1) {
715 (unsigned long)wsi->http.ah->pos,
716 (unsigned long)wsi->a.context->max_http_header_data);
723 lws_hdr_simple_create(struct lws *wsi, enum lws_token_indexes h, const char *s)
730 wsi->http.ah->frag_index[h] = 0;
735 wsi->http.ah->nfrag++;
736 if (wsi->http.ah->nfrag == LWS_ARRAY_SIZE(wsi->http.ah->frags)) {
741 wsi->http.ah->frag_index[h] = wsi->http.ah->nfrag;
743 wsi->http.ah->frags[wsi->http.ah->nfrag].offset = wsi->http.ah->pos;
744 wsi->http.ah->frags[wsi->http.ah->nfrag].len = 0;
745 wsi->http.ah->frags[wsi->http.ah->nfrag].nfrag = 0;
748 if (lws_pos_in_bounds(wsi))
751 wsi->http.ah->data[wsi->http.ah->pos++] = *s;
753 wsi->http.ah->frags[wsi->http.ah->nfrag].len++;
760 issue_char(struct lws *wsi, unsigned char c)
764 if (lws_pos_in_bounds(wsi))
767 frag_len = wsi->http.ah->frags[wsi->http.ah->nfrag].len;
772 if (!wsi->http.ah->current_token_limit ||
773 frag_len < wsi->http.ah->current_token_limit) {
774 wsi->http.ah->data[wsi->http.ah->pos++] = (char)c;
775 wsi->http.ah->frags[wsi->http.ah->nfrag].len++;
780 if (frag_len == wsi->http.ah->current_token_limit) {
781 if (lws_pos_in_bounds(wsi))
784 wsi->http.ah->data[wsi->http.ah->pos++] = '\0';
786 (long)wsi->http.ah->parser_state,
787 (long)wsi->http.ah->current_token_limit);
794 lws_parse_urldecode(struct lws *wsi, uint8_t *_c)
796 struct allocated_headers *ah = wsi->http.ah;
863 if (issue_char(wsi, '\0') < 0)
866 wsi->http.ah->frags[wsi->http.ah->nfrag].len--;
924 if (issue_char(wsi, '.') < 0)
954 if (issue_char(wsi, '.') < 0)
956 if (issue_char(wsi, '.') < 0)
968 if (issue_char(wsi, '\0') < 0)
972 wsi->http.ah->frags[wsi->http.ah->nfrag].len--;
1018 lws_parse(struct lws *wsi, unsigned char *buf, int *len)
1020 struct allocated_headers *ah = wsi->http.ah;
1021 struct lws_context *context = wsi->a.context;
1026 assert(wsi->http.ah);
1051 if (lws_pos_in_bounds(wsi))
1081 if (issue_char(wsi, '/') < 0)
1103 if (issue_char(wsi, '\0') < 0)
1106 wsi->http.ah->frags[wsi->http.ah->nfrag].len--;
1111 r = lws_parse_urldecode(wsi, &c);
1143 n = (unsigned int)issue_char(wsi, c);
1157 wsi->http.ah->frags[wsi->http.ah->nfrag].len--;
1171 "wsi->lextable_pos=%d\n", c, c,
1172 (unsigned long)lwsi_role(wsi),
1187 if (!wsi->mux_substream && !ah->unk_pos) {
1199 if (!lws_pos_in_bounds(wsi))
1204 if (lws_pos_in_bounds(wsi))
1211 if (!wsi->mux_substream && pos < 0 && c == ':') {
1284 if (!wsi->mux_substream) {
1315 if (ah->lextable_pos < 0 && lwsi_role_h1(wsi) &&
1316 lwsi_role_server(wsi)) {
1330 if (wsi->mux_substream)
1341 if (!wsi->mux_substream)
1356 if (lws_check_opt(wsi->a.vhost->options,
1372 if (!wsi->mux_substream)
1397 if (!wsi->mux_substream) {
1426 wsi->a.context->max_http_header_data;
1439 if (!wsi->mux_substream)
1467 if (issue_char(wsi, ' ') < 0)
1512 if (lws_hdr_total_length(wsi, WSI_TOKEN_UPGRADE)) {
1514 const char *pv = lws_hdr_simple_ptr(wsi, WSI_TOKEN_VERSION);
1516 wsi->rx_frame_type = (char)atoi(pv);
1518 lwsl_parser("v%02d hdrs done\n", wsi->rx_frame_type);
1522 wsi->hdr_parsing_completed = 1;
1529 lws_return_http_status(wsi, HTTP_STATUS_FORBIDDEN, NULL);
1536 lws_http_cookie_get(struct lws *wsi, const char *name, char *buf,
1543 n = lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COOKIE);
1553 if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COLON_METHOD)) {
1559 int f = wsi->http.ah->frag_index[WSI_TOKEN_HTTP_COOKIE];
1563 p = wsi->http.ah->data + wsi->http.ah->frags[f].offset;
1564 fl = (size_t)wsi->http.ah->frags[f].len;
1578 f = wsi->http.ah->frags[f].nfrag;
1589 p = lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_COOKIE);
1621 lws_jwt_get_http_cookie_validate_jwt(struct lws *wsi,
1631 if (lws_http_cookie_get(wsi, i->cookie_name, out, out_len)) {
1639 if (lws_jwt_signed_validate(wsi->a.context, i->jwk, i->alg, out,
1674 lws_jwt_sign_token_set_http_cookie(struct lws *wsi,
1687 lws_hex_random(wsi->a.context, csrf, sizeof(csrf));
1689 if (lws_jwt_sign_compact(wsi->a.context, i->jwk, i->alg, plain, &pl,
1718 if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_SET_COOKIE,