149 Z_GDU *zgdu_req = package.request().get();
152 if (!zgdu_req || zgdu_req->which != Z_GDU_HTTP_Request)
157 std::list<CGI::Exec>::const_iterator it;
158 metaproxy_1::odr odr;
159 Z_HTTP_Request *hreq = zgdu_req->u.HTTP_Request;
160 const char *path_cstr = hreq->path;
161 for (it =
m_p->exec_map.begin(); it !=
m_p->exec_map.end(); it++)
163 if (strncmp(it->path.c_str(), path_cstr, it->path.length()) == 0)
166 int r = pipe(fds_response);
169 zgdu_res = odr.create_HTTP_Response(
170 package.session(), hreq, 400);
171 package.response() = zgdu_res;
175 r = pipe(fds_request);
178 zgdu_res = odr.create_HTTP_Response(
179 package.session(), hreq, 400);
180 package.response() = zgdu_res;
181 close(fds_response[0]);
182 close(fds_response[1]);
187 pid_t pid = ::fork();
194 close(fds_request[1]);
197 close(fds_response[0]);
198 dup(fds_response[1]);
199 m_p->child(hreq, &(*it));
202 close(fds_request[0]);
203 close(fds_request[1]);
204 close(fds_response[0]);
205 close(fds_response[1]);
206 zgdu_res = odr.create_HTTP_Response(
207 package.session(), hreq, 400);
208 package.response() = zgdu_res;
211 close(fds_response[1]);
212 close(fds_request[0]);
215 boost::mutex::scoped_lock lock(
m_p->m_mutex);
216 m_p->children[pid] = pid;
218 WRBUF w = wrbuf_alloc();
219 wrbuf_puts(w,
"HTTP/1.1 200 OK\r\n");
220 fcntl(fds_response[0], F_SETFL, O_NONBLOCK);
221 fcntl(fds_request[1], F_SETFL, O_NONBLOCK);
226 struct yaz_poll_fd fds[2];
227 fds[0].fd = fds_response[0];
228 fds[0].input_mask = yaz_poll_read;
229 if (no_write < hreq->content_len)
231 fds[1].fd = fds_request[1];
232 fds[1].input_mask = yaz_poll_write;
235 int r = yaz_poll(fds, num, 60, 0);
238 if (fds[0].output_mask & (yaz_poll_read|yaz_poll_except))
241 ssize_t rd = read(fds_response[0], buf,
sizeof buf);
244 wrbuf_write(w, buf, rd);
246 if (num == 2 && fds[1].output_mask & yaz_poll_write)
248 ssize_t wd = write(fds_request[1],
249 hreq->content_buf + no_write,
250 hreq->content_len - no_write);
256 close(fds_request[1]);
257 close(fds_response[0]);
258 waitpid(pid, &status, 0);
262 boost::mutex::scoped_lock lock(
m_p->m_mutex);
263 m_p->children.erase(pid);
265 ODR dec = odr_createmem(ODR_DECODE);
266 odr_setbuf(dec, wrbuf_buf(w), wrbuf_len(w), 0);
267 r = z_GDU(dec, &zgdu_res, 0, 0);
270 package.response() = zgdu_res;
274 zgdu_res = odr.create_HTTP_Response(
275 package.session(), zgdu_req->u.HTTP_Request, 400);
276 Z_HTTP_Response *hres = zgdu_res->u.HTTP_Response;
277 z_HTTP_header_add(odr, &hres->headers,
278 "Content-Type",
"text/plain");
280 odr_strdup(odr,
"Invalid script from script");
281 hres->content_len = strlen(hres->content_buf);
283 package.response() = zgdu_res;