src/server/safs/cgi.c

changeset 125
c913d515be1e
parent 124
85985e88f63b
child 126
631aaa01b2b5
equal deleted inserted replaced
124:85985e88f63b 125:c913d515be1e
34 34
35 #include "../util/util.h" 35 #include "../util/util.h"
36 #include "../util/pblock.h" 36 #include "../util/pblock.h"
37 #include "../../ucx/string.h" 37 #include "../../ucx/string.h"
38 38
39 #include "../util/io.h"
40
39 #include "cgiutils.h" 41 #include "cgiutils.h"
40 42
41 #define CGI_VARS 32 43 #define CGI_VARS 32
42 44
43 #define CGI_RESPONSE_PARSER_BUFLEN 2048 45 #define CGI_RESPONSE_PARSER_BUFLEN 2048
104 close(cgip.in[1]); 106 close(cgip.in[1]);
105 107
106 // read from child 108 // read from child
107 CGIResponseParser *parser = cgi_parser_new(sn, rq); 109 CGIResponseParser *parser = cgi_parser_new(sn, rq);
108 WSBool cgiheader = TRUE; 110 WSBool cgiheader = TRUE;
109 111 ssize_t wr = 0;
112 int result = REQ_PROCEED;
110 while((r = read(cgip.out[0], buf, 4096)) > 0) { 113 while((r = read(cgip.out[0], buf, 4096)) > 0) {
111 if(cgiheader) { 114 if(cgiheader) {
112 size_t pos; 115 size_t pos;
113 int ret = cgi_parse_response(parser, buf, r, &pos); 116 int ret = cgi_parse_response(parser, buf, r, &pos);
114 if(ret == -1) { 117 if(ret == -1) {
115 protocol_status(sn, rq, 500, NULL); 118 protocol_status(sn, rq, 500, NULL);
116 cgi_parser_free(parser); 119 result = REQ_ABORTED;
117 return REQ_ABORTED; 120 break;
118 } else if(ret == 0) { 121 } else if(ret == 0) {
119 122
120 } else if(ret == 1) { 123 } else if(ret == 1) {
121 cgiheader = FALSE; 124 cgiheader = FALSE;
122 if(parser->status > 0) { 125 if(parser->status > 0) {
123 protocol_status(sn, rq, parser->status, parser->msg); 126 protocol_status(sn, rq, parser->status, parser->msg);
124 } 127 }
125 http_start_response(sn, rq); 128 http_start_response(sn, rq);
126 if(pos < r) { 129 if(pos < r) {
127 net_write(sn->csd, buf+pos, r-pos); 130 wr = net_write(sn->csd, &buf[pos], r-pos);
131 if(wr <= 0) {
132 result = REQ_ABORTED;
133 break;
134 }
128 } 135 }
129 } 136 }
130 } else { 137 } else {
131 net_write(sn->csd, buf, r); 138 wr = net_write(sn->csd, buf, r);
139 if(wr <= 0) {
140 result = REQ_ABORTED;
141 break;
142 }
132 } 143 }
133 } 144 }
134 145
135 cgi_parser_free(parser); 146 cgi_parser_free(parser);
136 return REQ_PROCEED; 147 return result;
137 } 148 }
138 149
139 int cgi_start(CGIProcess *p, char *path, char *const argv[], char *const envp[]) { 150 int cgi_start(CGIProcess *p, char *path, char *const argv[], char *const envp[]) {
140 if(pipe(p->in) || pipe(p->out)) { 151 if(pipe(p->in) || pipe(p->out)) {
141 log_ereport( 152 log_ereport(

mercurial