Lines Matching refs:wsi
81 if (!cgi->wsi->http.cgi->post_in_expected)
82 cgi->wsi->http.cgi->cgi_transaction_over = 1;
84 lws_callback_on_writable(cgi->wsi);
92 struct lws *wsi = (struct lws *)opaque;
98 if (wsi->http.cgi)
99 lwsl_wsi_info(wsi, "post_in_expected %d",
100 (int)wsi->http.cgi->post_in_expected);
106 if (wsi->http.cgi)
107 lws_sul_schedule(wsi->a.context, wsi->tsi, &wsi->http.cgi->sul_grace,
112 lws_cgi(struct lws *wsi, const char * const *exec_array,
116 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
124 * give the cgi stream wsi a cgi struct
127 wsi->http.cgi = lws_zalloc(sizeof(*wsi->http.cgi), "new cgi");
128 if (!wsi->http.cgi) {
129 lwsl_wsi_err(wsi, "OOM");
133 wsi->http.cgi->response_code = HTTP_STATUS_OK;
135 cgi = wsi->http.cgi;
136 cgi->wsi = wsi; /* set cgi's owning wsi */
141 lws_set_timeout(wsi, PENDING_TIMEOUT_CGI, timeout_secs);
144 wsi->hdr_state = LCHS_HEADER;
147 lwsl_wsi_debug(wsi, "adding cgi %p to list", wsi->http.cgi);
159 char *pct = lws_hdr_simple_ptr(wsi,
163 wsi->http.cgi->gzip_inflate = 1;
170 if (lws_is_ssl(wsi)) {
176 if (wsi->http.ah) {
202 if (lws_hdr_total_length(wsi, meths[m]) >=
225 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_COLON_METHOD));
227 lws_hdr_simple_ptr(wsi,
236 lws_hdr_simple_ptr(wsi, (enum lws_token_indexes)uritok));
243 i = lws_hdr_copy_fragment(wsi, tok, sizeof(tok),
265 c = lws_hdr_copy(wsi, cgi_path + 12,
285 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_REFERER)) {
288 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_REFERER));
293 lws_hdr_total_length(wsi, WSI_TOKEN_HOST)) {
296 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HOST));
300 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COOKIE)) {
303 m = lws_hdr_copy(wsi, p, lws_ptr_diff(end, p), WSI_TOKEN_HTTP_COOKIE);
305 p += lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_COOKIE);
310 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_USER_AGENT)) {
313 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_USER_AGENT));
318 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_ENCODING)) {
321 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_CONTENT_ENCODING));
325 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_ACCEPT)) {
328 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_ACCEPT));
332 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING)) {
335 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_ACCEPT_ENCODING));
340 if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE)) {
343 lws_hdr_simple_ptr(wsi, WSI_TOKEN_HTTP_CONTENT_TYPE));
346 if (!wsi->http.cgi->gzip_inflate &&
347 lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH)) {
350 lws_hdr_simple_ptr(wsi,
355 if (lws_hdr_total_length(wsi, WSI_TOKEN_HTTP_CONTENT_LENGTH))
356 wsi->http.cgi->post_in_expected = (lws_filepos_t)
357 atoll(lws_hdr_simple_ptr(wsi,
375 wsi->http.cgi->implied_chunked = 1;
376 wsi->http.cgi->explicitly_chunked = 1;
399 info.opt_parent = wsi;
401 info.tsi = wsi->tsi;
402 info.vh = wsi->a.vhost;
404 info.plsp = &wsi->http.cgi->lsp;
405 info.opaque = wsi;
413 lws_header_table_detach(wsi, 0);
417 wsi->http.cgi->lsp = lws_spawn_piped(&info);
418 if (!wsi->http.cgi->lsp) {
425 wsi->a.context->count_cgi_spawned++;
428 n = user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
430 wsi->user_space, NULL, (unsigned int)cgi->lsp->child_pid);
436 lws_sul_cancel(&wsi->http.cgi->sul_grace);
437 lws_free_set_NULL(wsi->http.cgi);
462 lws_cgi_write_split_stdout_headers(struct lws *wsi)
470 if (!wsi->http.cgi)
473 while (wsi->hdr_state != LHCS_PAYLOAD) {
478 switch (wsi->hdr_state) {
480 lwsl_wsi_debug(wsi, "LHCS_RESPONSE: iss response %d",
481 wsi->http.cgi->response_code);
482 if (lws_add_http_header_status(wsi,
483 (unsigned int)wsi->http.cgi->response_code,
486 if (!wsi->http.cgi->explicitly_chunked &&
487 !wsi->http.cgi->content_length &&
488 lws_add_http_header_by_token(wsi,
492 if (!(wsi->mux_substream))
493 if (lws_add_http_header_by_token(wsi,
498 n = lws_write(wsi, start, lws_ptr_diff_size_t(p, start),
503 * starting from wsi->http.cgi->headers_buf through
504 * wsi->http.cgi->headers_pos. These are OK for http/1
510 if (!wsi->mux_substream)
513 p = wsi->http.cgi->headers_start;
514 wsi->http.cgi->headers_start =
515 wsi->http.cgi->headers_pos;
516 wsi->http.cgi->headers_dumped =
517 wsi->http.cgi->headers_start;
521 while (p < wsi->http.cgi->headers_start) {
563 p + 1 == wsi->http.cgi->headers_start) {
571 lws_add_http_header_by_name(wsi, buf,
573 (unsigned char **)&wsi->http.cgi->headers_pos,
574 (unsigned char *)wsi->http.cgi->headers_end))
587 if (lws_finalize_http_header(wsi,
588 (unsigned char **)&wsi->http.cgi->headers_pos,
589 (unsigned char *)wsi->http.cgi->headers_end)) {
595 wsi->hdr_state = LHCS_DUMP_HEADERS;
596 wsi->reason_bf |= LWS_CB_REASON_AUX_BF__CGI_HEADERS;
597 lws_callback_on_writable(wsi);
603 n = (int)(wsi->http.cgi->headers_pos -
604 wsi->http.cgi->headers_dumped);
608 lwsl_wsi_debug(wsi, "LHCS_DUMP_HEADERS: %d", n);
611 if (wsi->http.cgi->headers_dumped + n !=
612 wsi->http.cgi->headers_pos) {
617 m = lws_write(wsi,
618 (unsigned char *)wsi->http.cgi->headers_dumped,
621 lwsl_wsi_debug(wsi, "write says %d", m);
624 wsi->http.cgi->headers_dumped += n;
625 if (wsi->http.cgi->headers_dumped ==
626 wsi->http.cgi->headers_pos) {
627 wsi->hdr_state = LHCS_PAYLOAD;
628 lws_free_set_NULL(wsi->http.cgi->headers_buf);
629 lwsl_wsi_debug(wsi, "freed cgi headers");
631 if (wsi->http.cgi->post_in_expected) {
632 lwsl_wsi_info(wsi, "post data still "
635 lws_callback_on_writable(wsi);
639 wsi->reason_bf |=
641 lws_callback_on_writable(wsi);
651 if (!wsi->http.cgi->headers_buf) {
654 if (wsi->mux_substream)
656 wsi->http.cgi->headers_buf = lws_malloc((unsigned int)n + LWS_PRE,
658 if (!wsi->http.cgi->headers_buf) {
659 lwsl_wsi_err(wsi, "OOM");
663 lwsl_wsi_debug(wsi, "allocated cgi hdrs");
664 wsi->http.cgi->headers_start =
665 wsi->http.cgi->headers_buf + LWS_PRE;
666 wsi->http.cgi->headers_pos = wsi->http.cgi->headers_start;
667 wsi->http.cgi->headers_dumped = wsi->http.cgi->headers_pos;
668 wsi->http.cgi->headers_end =
669 wsi->http.cgi->headers_buf + n - 1;
672 wsi->http.cgi->match[n] = 0;
673 wsi->http.cgi->lp = 0;
677 n = lws_get_socket_fd(wsi->http.cgi->lsp->stdwsi[LWS_STDOUT]);
683 lwsl_wsi_debug(wsi, "read says %d", n);
689 if (wsi->http.cgi->headers_pos >=
690 wsi->http.cgi->headers_end - 4) {
691 lwsl_wsi_notice(wsi, "CGI hdrs > buf size");
699 lwsl_wsi_debug(wsi, "-- 0x%02X %c %d %d", (unsigned char)c, c,
700 wsi->http.cgi->match[1], wsi->hdr_state);
703 switch (wsi->hdr_state) {
711 if (!significant_hdr[n][wsi->http.cgi->match[n]] &&
713 wsi->http.cgi->lp < (int)sizeof(wsi->http.cgi->l) - 1) {
714 wsi->http.cgi->l[wsi->http.cgi->lp++] = c;
715 wsi->http.cgi->l[wsi->http.cgi->lp] = '\0';
718 wsi->http.cgi->content_length =
719 (lws_filepos_t)atoll(wsi->http.cgi->l);
722 wsi->http.cgi->response_code =
723 atoi(wsi->http.cgi->l);
724 lwsl_wsi_debug(wsi, "Status set to %d",
725 wsi->http.cgi->response_code);
732 if (significant_hdr[n][wsi->http.cgi->match[n]]) {
734 significant_hdr[n][wsi->http.cgi->match[n]])
735 wsi->http.cgi->match[n]++;
737 wsi->http.cgi->match[n] = 0;
743 wsi->hdr_state = LCHS_SINGLE_0A;
744 *wsi->http.cgi->headers_pos++ = '\x0d';
746 *wsi->http.cgi->headers_pos++ = (unsigned char)c;
748 wsi->hdr_state = LCHS_LF1;
750 if (wsi->hdr_state != LCHS_HEADER &&
752 [wsi->http.cgi->match[
754 lwsl_wsi_info(wsi, "cgi produced chunked");
755 wsi->http.cgi->explicitly_chunked = 1;
759 if (wsi->hdr_state != LCHS_HEADER &&
761 wsi->http.cgi->match[SIGNIFICANT_HDR_LOCATION]]) {
762 lwsl_wsi_debug(wsi, "CGI: Location hdr seen");
763 wsi->http.cgi->response_code = 302;
767 *wsi->http.cgi->headers_pos++ = (unsigned char)c;
769 wsi->hdr_state = LCHS_CR2;
773 lwsl_wsi_debug(wsi, "funny CRLF 0x%02X",
780 wsi->hdr_state = LCHS_LF2;
783 wsi->hdr_state = LCHS_HEADER;
785 wsi->http.cgi->match[n] = 0;
786 wsi->http.cgi->lp = 0;
791 m = wsi->hdr_state;
793 lwsl_wsi_debug(wsi, "Content-Length: %lld",
795 wsi->http.cgi->content_length);
796 wsi->hdr_state = LHCS_RESPONSE;
807 *wsi->http.cgi->headers_pos++ = (unsigned char)c;
808 wsi->hdr_state = LCHS_HEADER;
810 wsi->http.cgi->match[n] = 0;
811 wsi->http.cgi->lp = 0;
819 if (!n || wsi->hdr_state == LHCS_PAYLOAD)
825 m = !wsi->http.cgi->implied_chunked && !wsi->mux_substream &&
826 // !wsi->http.cgi->explicitly_chunked &&
827 !wsi->http.cgi->content_length;
828 n = lws_get_socket_fd(wsi->http.cgi->lsp->stdwsi[LWS_STDOUT]);
834 lwsl_wsi_debug(wsi, "stdout read says %d", n);
840 if (!wsi->mux_substream && m) {
852 if (wsi->mux_substream) {
853 struct lws *nwsi = lws_get_network_wsi(wsi);
855 __lws_set_timeout(wsi,
865 if (wsi->http.cgi->content_length_seen + (unsigned int)n ==
866 wsi->http.cgi->content_length)
869 m = lws_write(wsi, (unsigned char *)start, (unsigned int)n, (enum lws_write_protocol)cmd);
872 lwsl_wsi_debug(wsi, "stdout write says %d\n", m);
875 wsi->http.cgi->content_length_seen += (unsigned int)n;
878 if (!wsi->mux_substream && m) {
881 lwsl_wsi_info(wsi, "sent trailer");
884 if (lws_write(wsi, term + LWS_PRE, 5,
888 wsi->http.cgi->cgi_transaction_over = 1;
893 if (wsi->cgi_stdout_zero_length) {
894 lwsl_wsi_debug(wsi, "stdout is POLLHUP'd");
895 if (wsi->mux_substream)
896 m = lws_write(wsi, (unsigned char *)start, 0,
902 wsi->cgi_stdout_zero_length = 1;
908 lws_cgi_kill(struct lws *wsi)
914 if (!wsi->http.cgi || !wsi->http.cgi->lsp)
917 pid = wsi->http.cgi->lsp->child_pid;
919 args.stdwsi = &wsi->http.cgi->lsp->stdwsi[0];
920 lws_spawn_piped_kill_child_process(wsi->http.cgi->lsp);
921 /* that has invalidated and NULL'd wsi->http.cgi->lsp */
924 if (wsi->http.cgi)
925 m = wsi->http.cgi->being_closed;
926 n = user_callback_handle_rxflow(wsi->a.protocol->callback, wsi,
928 wsi->user_space, (void *)&args,
931 lws_close_free_wsi(wsi, 0, "lws_cgi_kill");
996 lws_cgi_kill(cgi->wsi);
1036 lwsl_wsi_debug(cgi->wsi, "expected cont len seen: %lld",
1057 lws_cgi_kill(cgi->wsi);
1067 lws_cgi_get_stdwsi(struct lws *wsi, enum lws_enum_stdinouterr ch)
1069 if (!wsi->http.cgi)
1072 return wsi->http.cgi->lsp->stdwsi[ch];
1076 lws_cgi_remove_and_kill(struct lws *wsi)
1078 struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
1084 if (*pcgi == wsi->http.cgi) {
1091 if (wsi->http.cgi->headers_buf)
1092 lws_free_set_NULL(wsi->http.cgi->headers_buf);
1095 wsi->http.cgi->being_closed = 1;
1096 lws_cgi_kill(wsi);