Lines Matching refs:cgi

77 	struct lws_cgi *cgi = lws_container_of(sul, struct lws_cgi, sul_grace);
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);
95 * The cgi has come to an end, by itself or with a signal...
98 if (wsi->http.cgi)
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,
120 struct lws_cgi *cgi;
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) {
133 wsi->http.cgi->response_code = HTTP_STATUS_OK;
135 cgi = wsi->http.cgi;
136 cgi->wsi = wsi; /* set cgi's owning wsi */
137 sum = cgi->summary;
138 sumend = sum + strlen(cgi->summary) - 1;
143 /* the cgi stdout is always sending us http1.x header data first */
147 lwsl_wsi_debug(wsi, "adding cgi %p to list", wsi->http.cgi);
148 cgi->cgi_list = pt->http.cgi_list;
149 pt->http.cgi_list = cgi;
163 wsi->http.cgi->gzip_inflate = 1;
346 if (!wsi->http.cgi->gzip_inflate &&
356 wsi->http.cgi->post_in_expected = (lws_filepos_t)
363 p += lws_snprintf(p, lws_ptr_diff_size_t(end, p), "PATH=/bin:/usr/bin:/usr/local/bin:/var/www/cgi-bin");
375 wsi->http.cgi->implied_chunked = 1;
376 wsi->http.cgi->explicitly_chunked = 1;
378 lwsl_info(" Applying mount-specific cgi env '%s'\n",
404 info.plsp = &wsi->http.cgi->lsp;
409 * Actually having made the env, as a cgi we don't need the ah
417 wsi->http.cgi->lsp = lws_spawn_piped(&info);
418 if (!wsi->http.cgi->lsp) {
427 /* inform cgi owner of the child PID */
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);
470 if (!wsi->http.cgi)
481 wsi->http.cgi->response_code);
483 (unsigned int)wsi->http.cgi->response_code,
486 if (!wsi->http.cgi->explicitly_chunked &&
487 !wsi->http.cgi->content_length &&
503 * starting from wsi->http.cgi->headers_buf through
504 * wsi->http.cgi->headers_pos. These are OK for http/1
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) {
573 (unsigned char **)&wsi->http.cgi->headers_pos,
574 (unsigned char *)wsi->http.cgi->headers_end))
588 (unsigned char **)&wsi->http.cgi->headers_pos,
589 (unsigned char *)wsi->http.cgi->headers_end)) {
603 n = (int)(wsi->http.cgi->headers_pos -
604 wsi->http.cgi->headers_dumped);
611 if (wsi->http.cgi->headers_dumped + n !=
612 wsi->http.cgi->headers_pos) {
618 (unsigned char *)wsi->http.cgi->headers_dumped,
624 wsi->http.cgi->headers_dumped += n;
625 if (wsi->http.cgi->headers_dumped ==
626 wsi->http.cgi->headers_pos) {
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) {
651 if (!wsi->http.cgi->headers_buf) {
656 wsi->http.cgi->headers_buf = lws_malloc((unsigned int)n + LWS_PRE,
657 "cgi hdr buf");
658 if (!wsi->http.cgi->headers_buf) {
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]);
689 if (wsi->http.cgi->headers_pos >=
690 wsi->http.cgi->headers_end - 4) {
700 wsi->http.cgi->match[1], 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);
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;
741 /* some cgi only send us \x0a for EOL */
744 *wsi->http.cgi->headers_pos++ = '\x0d';
746 *wsi->http.cgi->headers_pos++ = (unsigned char)c;
752 [wsi->http.cgi->match[
754 lwsl_wsi_info(wsi, "cgi produced chunked");
755 wsi->http.cgi->explicitly_chunked = 1;
761 wsi->http.cgi->match[SIGNIFICANT_HDR_LOCATION]]) {
763 wsi->http.cgi->response_code = 302;
767 *wsi->http.cgi->headers_pos++ = (unsigned char)c;
785 wsi->http.cgi->match[n] = 0;
786 wsi->http.cgi->lp = 0;
795 wsi->http.cgi->content_length);
807 *wsi->http.cgi->headers_pos++ = (unsigned char)c;
810 wsi->http.cgi->match[n] = 0;
811 wsi->http.cgi->lp = 0;
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]);
865 if (wsi->http.cgi->content_length_seen + (unsigned int)n ==
866 wsi->http.cgi->content_length)
875 wsi->http.cgi->content_length_seen += (unsigned int)n;
888 wsi->http.cgi->cgi_transaction_over = 1;
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;
940 struct lws_cgi **pcgi, *cgi = NULL;
952 /* check all the subprocesses on the cgi list */
955 cgi = *pcgi;
958 if (cgi->lsp->child_pid <= 0)
962 if (cgi->headers_buf)
966 if (cgi->content_length > cgi->content_length_seen)
969 if (cgi->content_length) {
972 (unsigned long long)cgi->content_length_seen);
979 * but we should do the terminated cgi callback
982 if (n == cgi->lsp->child_pid) {
984 if (!cgi->content_length) {
988 * cgi terminated to send buffered
990 cgi->chunked_grace++;
995 cgi->lsp->child_pid = 0;
996 lws_cgi_kill(cgi->wsi);
1000 cgi = NULL;
1002 /* if not found on the cgi list, as he's one of ours, reap */
1003 if (!cgi)
1010 /* check all the subprocesses on the cgi list */
1013 cgi = *pcgi;
1016 if (!cgi || !cgi->lsp || cgi->lsp->child_pid <= 0)
1020 if (cgi->chunked_grace) {
1021 cgi->chunked_grace++;
1022 if (cgi->chunked_grace < 2)
1028 if (cgi->headers_buf)
1032 if (cgi->content_length > cgi->content_length_seen)
1035 if (cgi->content_length)
1036 lwsl_wsi_debug(cgi->wsi, "expected cont len seen: %lld",
1037 (unsigned long long)cgi->content_length_seen);
1040 if (waitpid(cgi->lsp->child_pid, &status, WNOHANG) > 0) {
1042 if (!cgi->content_length) {
1046 * cgi terminated to send buffered
1048 cgi->chunked_grace++;
1052 lwsl_cx_debug(pt->context, "found PID %d on cgi list",
1053 cgi->lsp->child_pid);
1056 cgi->lsp->child_pid = 0;
1057 lws_cgi_kill(cgi->wsi);
1069 if (!wsi->http.cgi)
1072 return wsi->http.cgi->lsp->stdwsi[ch];
1081 /* remove us from the cgi list */
1084 if (*pcgi == wsi->http.cgi) {
1085 /* drop us from the pt cgi list */
1091 if (wsi->http.cgi->headers_buf)
1092 lws_free_set_NULL(wsi->http.cgi->headers_buf);
1094 /* we have a cgi going, we must kill it */
1095 wsi->http.cgi->being_closed = 1;