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( |