311 |
311 |
312 if(handler->debug_finished) { |
312 if(handler->debug_finished) { |
313 log_ereport(LOG_DEBUG, "cgi-send: req: %p debug_finished: 1 cgi_stdout_readevent events: %d", handler->parser->rq, handler->events); |
313 log_ereport(LOG_DEBUG, "cgi-send: req: %p debug_finished: 1 cgi_stdout_readevent events: %d", handler->parser->rq, handler->events); |
314 } |
314 } |
315 |
315 |
|
316 if(handler->cgi_eof) { |
|
317 // cgi_eof will be set to true by cgi_read_output |
|
318 // if it is true here, the cgi handling was finished by cgi_writeevent |
|
319 // in that case, cgi_writeevent will finish the request processing |
|
320 // and nothing needs to be done here |
|
321 handler->wait_read = FALSE; |
|
322 event->finish = NULL; |
|
323 return 0; |
|
324 } |
|
325 |
316 event->finish = cgi_event_finish; |
326 event->finish = cgi_event_finish; |
317 handler->writeev->finish = NULL; |
327 handler->writeev->finish = NULL; |
318 CgiIOResult ret = cgi_read_output(handler, ev); |
328 CgiIOResult ret = cgi_read_output(handler, ev); |
319 switch(ret) { |
329 switch(ret) { |
320 case CGI_IO_COMPLETE: { |
330 case CGI_IO_COMPLETE: { |
345 return 0; |
355 return 0; |
346 } |
356 } |
347 |
357 |
348 int cgi_writeevent(EventHandler *ev, Event *event) { |
358 int cgi_writeevent(EventHandler *ev, Event *event) { |
349 CGIHandler *handler = event->cookie; |
359 CGIHandler *handler = event->cookie; |
|
360 |
|
361 if(handler->cgi_eof) { |
|
362 log_ereport(LOG_DEBUG, "cgi-send: req: %p writeevent cgi_eof = TRUE", handler->parser->rq); |
|
363 } |
350 |
364 |
351 event->finish = cgi_event_finish; |
365 event->finish = cgi_event_finish; |
352 handler->readev->finish = NULL; |
366 handler->readev->finish = NULL; |
353 CgiIOResult ret = cgi_read_output(handler, ev); |
367 CgiIOResult ret = cgi_read_output(handler, ev); |
354 switch(ret) { |
368 switch(ret) { |
567 } |
581 } |
568 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); |
582 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); |
569 |
583 |
570 handler->debug_finished = TRUE; |
584 handler->debug_finished = TRUE; |
571 |
585 |
572 if(handler->result == REQ_ABORTED && handler->process.pid != 0) { |
586 if(handler->result == REQ_ABORTED && handler->process.pid != 0 && handler->cgi_kill == 0) { |
573 log_ereport(LOG_FAILURE, "cgi-send: kill script: %s pid: %d", handler->path, (int)handler->process.pid); |
587 log_ereport(LOG_FAILURE, "cgi-send: kill script: %s pid: %d", handler->path, (int)handler->process.pid); |
574 if(kill(handler->process.pid, SIGTERM)) { |
588 if(kill(handler->process.pid, SIGTERM)) { |
575 log_ereport(LOG_FAILURE, "cgi-send: pid: %d kill failed: %s", (int)handler->process.pid, strerror(errno)); |
589 log_ereport(LOG_FAILURE, "cgi-send: pid: %d kill failed: %s", (int)handler->process.pid, strerror(errno)); |
576 } else { |
590 } else { |
577 log_ereport(LOG_DEBUG, "cgi-send: finish: req: %p kill %d successful", rq, (int)handler->process.pid); |
591 log_ereport(LOG_DEBUG, "cgi-send: finish: req: %p kill %d successful", rq, (int)handler->process.pid); |
|
592 handler->cgi_kill = SIGTERM; |
578 } |
593 } |
579 } |
594 } |
580 |
595 |
581 if(--handler->events > 0) { |
596 if(--handler->events > 0) { |
582 return 0; |
597 return 0; |
590 log_ereport(LOG_FAILURE, "cgi_event_finish: event_removepoll: %s", strerror(errno)); |
605 log_ereport(LOG_FAILURE, "cgi_event_finish: event_removepoll: %s", strerror(errno)); |
591 } |
606 } |
592 handler->poll_out = FALSE; |
607 handler->poll_out = FALSE; |
593 } |
608 } |
594 |
609 |
595 /* |
610 if(handler->wait_read) { |
596 if(--handler->events > 0) { |
611 // read event registered, however it will not be activated anymore |
597 if(handler->events == 1) { |
612 // (currently unsure if this can happen) |
598 if(handler->poll_out) { |
613 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: remove-poll read", rq); |
599 // write event registered, however it will not be activated anymore |
614 if(ev_remove_poll(ev, handler->process.out[0])) { |
600 // we can safely remove the event |
615 log_ereport(LOG_FAILURE, "cgi_event_finish: req: %p ev_remove_poll: %s", rq, strerror(errno)); |
601 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: event: 1 remove-poll write", rq); |
616 } |
602 if(event_removepoll(ev, sn->csd)) { |
617 handler->wait_read = FALSE; |
603 log_ereport(LOG_FAILURE, "cgi_event_finish: event_removepoll: %s", strerror(errno)); |
618 } |
604 } |
|
605 } else if(handler->cgi_eof && handler->wait_read) { |
|
606 log_ereport(LOG_DEBUG, "cgi-send: req: %p finish: event: 1 remove-poll read", rq); |
|
607 if(ev_remove_poll(ev, handler->process.out[0])) { |
|
608 log_ereport(LOG_FAILURE, "cgi_event_finish: ev_remove_poll: %s", strerror(errno)); |
|
609 } |
|
610 } else { |
|
611 return 0; |
|
612 } |
|
613 } else { |
|
614 return 0; |
|
615 } |
|
616 } |
|
617 */ |
|
618 |
619 |
619 log_ereport(LOG_DEBUG, "cgi-send: req: %p cgi_close", rq); |
620 log_ereport(LOG_DEBUG, "cgi-send: req: %p cgi_close", rq); |
620 |
621 |
621 int exit_code = cgi_close(&handler->process); |
622 int exit_code = cgi_close(&handler->process); |
622 if(exit_code != 0) { |
623 if(exit_code != 0) { |