306 } |
306 } |
307 |
307 |
308 int cgi_stdout_readevent(EventHandler *ev, Event *event) { |
308 int cgi_stdout_readevent(EventHandler *ev, Event *event) { |
309 CGIHandler *handler = event->cookie; |
309 CGIHandler *handler = event->cookie; |
310 |
310 |
|
311 if(handler->debug_finished) { |
|
312 log_ereport(LOG_DEBUG, "cgi-send: req: %p debug_finished: 1 cgi_stdout_readevent events: %d", handler->parser.rq, handler->events); |
|
313 } |
|
314 |
311 event->finish = cgi_event_finish; |
315 event->finish = cgi_event_finish; |
312 handler->writeev->finish = NULL; |
316 handler->writeev->finish = NULL; |
313 CgiIOResult ret = cgi_read_output(handler, ev); |
317 CgiIOResult ret = cgi_read_output(handler, ev); |
314 switch(ret) { |
318 switch(ret) { |
315 case CGI_IO_COMPLETE: { |
319 case CGI_IO_COMPLETE: { |
325 } |
329 } |
326 if(event_pollout(ev, handler->parser->sn->csd, handler->writeev)) { |
330 if(event_pollout(ev, handler->parser->sn->csd, handler->writeev)) { |
327 handler->result = REQ_ABORTED; |
331 handler->result = REQ_ABORTED; |
328 } else { |
332 } else { |
329 handler->poll_out = TRUE; |
333 handler->poll_out = TRUE; |
330 handler->events++; |
|
331 log_ereport(LOG_DEBUG, "cgi-send: req: %p enable poll out", handler->parser->rq); |
334 log_ereport(LOG_DEBUG, "cgi-send: req: %p enable poll out", handler->parser->rq); |
332 return 1; // keep readevent active |
335 return 1; // keep readevent active |
333 } |
336 } |
334 } |
337 } |
335 case CGI_IO_ERROR: { |
338 case CGI_IO_ERROR: { |
557 event_fn = "stdout"; |
560 event_fn = "stdout"; |
558 } else if(event->fn == cgi_stderr_readevent) { |
561 } else if(event->fn == cgi_stderr_readevent) { |
559 event_fn = "stderr"; |
562 event_fn = "stderr"; |
560 } else if(event->fn == cgi_writeevent) { |
563 } else if(event->fn == cgi_writeevent) { |
561 event_fn = "httpout"; |
564 event_fn = "httpout"; |
|
565 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: pid: %d", rq, handler->process.pid); |
562 } |
566 } |
563 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: event: %d pollout: %d wait_read: %d cgi_eof: %d fn: %s", rq, handler->events, handler->poll_out, handler->wait_read, handler->cgi_eof, event_fn); |
567 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: event: %d pollout: %d wait_read: %d cgi_eof: %d fn: %s", rq, handler->events, handler->poll_out, handler->wait_read, handler->cgi_eof, event_fn); |
|
568 |
|
569 handler->debug_finished = TRUE; |
|
570 |
|
571 if(--handler->events > 0) { |
|
572 return 0; |
|
573 } |
564 |
574 |
565 if(handler->poll_out) { |
575 if(handler->poll_out) { |
566 // write event registered, however it will not be activated anymore |
576 // write event registered, however it will not be activated anymore |
567 // we can safely remove the event |
577 // we can safely remove the event |
568 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: remove-poll write", rq); |
578 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: remove-poll write", rq); |
569 if(event_removepoll(ev, sn->csd)) { |
579 if(event_removepoll(ev, sn->csd)) { |
570 log_ereport(LOG_FAILURE, "cgi_event_finish: event_removepoll: %s", strerror(errno)); |
580 log_ereport(LOG_FAILURE, "cgi_event_finish: event_removepoll: %s", strerror(errno)); |
571 } |
581 } |
572 handler->events--; |
|
573 handler->poll_out = FALSE; |
582 handler->poll_out = FALSE; |
574 } |
|
575 |
|
576 if(--handler->events > 0) { |
|
577 return 0; |
|
578 } |
583 } |
579 |
584 |
580 /* |
585 /* |
581 if(--handler->events > 0) { |
586 if(--handler->events > 0) { |
582 if(handler->events == 1) { |
587 if(handler->events == 1) { |