src/server/safs/cgi.c

changeset 530
1e117b5d6710
parent 528
8206bfafb7a6
child 532
d8212d4f24f2
equal deleted inserted replaced
529:cd606400f0ba 530:1e117b5d6710
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) {

mercurial