comparison src/http/ngx_http_event.c @ 11:f323b4f74e4a

nginx-0.0.1-2002-09-12-18:42:29 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 12 Sep 2002 14:42:29 +0000
parents 4f3879d9b6f6
children 055ed05235ae
comparison
equal deleted inserted replaced
10:4f3879d9b6f6 11:f323b4f74e4a
14 #include <ngx_http_output_filter.h> 14 #include <ngx_http_output_filter.h>
15 int ngx_http_static_handler(ngx_http_request_t *r); 15 int ngx_http_static_handler(ngx_http_request_t *r);
16 int ngx_http_index_handler(ngx_http_request_t *r); 16 int ngx_http_index_handler(ngx_http_request_t *r);
17 /* */ 17 /* */
18 18
19 /* STUB */
20 #define LINGERING_TIMEOUT 2
21 #define SOME_LINGERING_TIME 30
19 22
20 int ngx_http_init_connection(ngx_connection_t *c); 23 int ngx_http_init_connection(ngx_connection_t *c);
21 24
22 static int ngx_http_init_request(ngx_event_t *ev); 25 static int ngx_http_init_request(ngx_event_t *ev);
23 static int ngx_http_process_request(ngx_event_t *ev); 26 static int ngx_http_process_request(ngx_event_t *ev);
31 34
32 static int ngx_http_handler(ngx_http_request_t *r); 35 static int ngx_http_handler(ngx_http_request_t *r);
33 static int ngx_http_set_default_handler(ngx_http_request_t *r); 36 static int ngx_http_set_default_handler(ngx_http_request_t *r);
34 37
35 static int ngx_http_writer(ngx_event_t *ev); 38 static int ngx_http_writer(ngx_event_t *ev);
39
40 static int ngx_http_lingering_close(ngx_event_t *ev);
36 41
37 static int ngx_http_special_response(ngx_http_request_t *r, int error); 42 static int ngx_http_special_response(ngx_http_request_t *r, int error);
38 static int ngx_http_redirect(ngx_http_request_t *r, int redirect); 43 static int ngx_http_redirect(ngx_http_request_t *r, int redirect);
39 static int ngx_http_error(ngx_http_request_t *r, int error); 44 static int ngx_http_error(ngx_http_request_t *r, int error);
40 45
332 size = r->client_content_length; 337 size = r->client_content_length;
333 if (size > r->server->discarded_buffer_size) 338 if (size > r->server->discarded_buffer_size)
334 size = r->server->discarded_buffer_size; 339 size = r->server->discarded_buffer_size;
335 340
336 n = ngx_event_recv(c, r->discarded_buffer, size); 341 n = ngx_event_recv(c, r->discarded_buffer, size);
337 if (n > 0) 342 if (n == NGX_ERROR)
338 r->client_content_length -= n; 343 return NGX_ERROR;
339 344
340 return n; 345 if (n == NGX_AGAIN)
346 return NGX_OK;
347
348 r->client_content_length -= n;
349 /* XXX: what if r->client_content_length == 0 ? */
350 return NGX_OK;
341 } 351 }
342 352
343 static int ngx_http_discarded_read(ngx_event_t *ev) 353 static int ngx_http_discarded_read(ngx_event_t *ev)
344 { 354 {
345 ssize_t n; 355 ssize_t n;
374 r->header_timeout = 1; 384 r->header_timeout = 1;
375 385
376 r->process_header = 0; 386 r->process_header = 0;
377 r->state_handler = NULL; 387 r->state_handler = NULL;
378 r->connection->unexpected_eof = 0; 388 r->connection->unexpected_eof = 0;
389 r->lingering_close = 1;
379 390
380 r->connection->read->event_handler = ngx_http_block_read; 391 r->connection->read->event_handler = ngx_http_block_read;
381 392
382 /* STUB: should find handler */ 393 /* STUB: should find handler */
383 r->filter = NGX_HTTP_FILTER_NEED_IN_MEMORY; 394 r->filter = NGX_HTTP_FILTER_NEED_IN_MEMORY;
424 if (rc >= NGX_HTTP_SPECIAL_RESPONSE) 435 if (rc >= NGX_HTTP_SPECIAL_RESPONSE)
425 return ngx_http_special_response(r, rc); 436 return ngx_http_special_response(r, rc);
426 437
427 /* rc == NGX_OK */ 438 /* rc == NGX_OK */
428 439
440 if (!r->keepalive) {
441 if (r->lingering_close) {
442 r->lingering_time = ngx_time() + SOME_LINGERING_TIME;
443 r->connection->read->event_handler = ngx_http_lingering_close;
444 ngx_del_timer(r->connection->read);
445 ngx_add_timer(r->connection->read, LINGERING_TIMEOUT * 1000);
446 if (ngx_add_event(r->connection->read, NGX_READ_EVENT,
447 NGX_ONESHOT_EVENT) == NGX_ERROR) {
448 return ngx_http_close_request(r);
449 }
450 if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN)
451 == NGX_ERROR)
452 {
453 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno,
454 ngx_shutdown_socket_n " failed");
455 return ngx_http_close_request(r);
456 }
457 } else {
458 return ngx_http_close_request(r);
459 }
460 }
461 }
462
463 static int ngx_http_lingering_close(ngx_event_t *ev)
464 {
465 ssize_t n;
466 ngx_msec_t timer;
467 ngx_connection_t *c;
468 ngx_http_request_t *r;
469
470 c = (ngx_connection_t *) ev->data;
471 r = (ngx_http_request_t *) c->data;
472
473 ngx_log_debug(ev->log, "http lingering close");
474
475 if (ev->timedout)
476 return NGX_DONE;
477
429 /* STUB */ 478 /* STUB */
430 return ngx_http_close_request(r); 479 timer = r->lingering_time - ngx_time();
431 480 if (timer <= 0)
432 /* 481 return NGX_DONE;
433 if (!keepalive) 482
434 if (linger) 483 if (r->discarded_buffer == NULL)
435 set linger timeout on read 484 ngx_test_null(r->discarded_buffer,
436 shutdown socket 485 ngx_palloc(r->pool, r->server->discarded_buffer_size),
437 else 486 NGX_ERROR);
438 close socket 487
439 */ 488 n = ngx_event_recv(c, r->discarded_buffer,
489 r->server->discarded_buffer_size);
490
491 if (n == NGX_ERROR)
492 return NGX_ERROR;
493
494 if (n == 0)
495 return NGX_DONE;
496
497 if (timer > LINGERING_TIMEOUT)
498 timer = LINGERING_TIMEOUT;
499
500 ngx_del_timer(ev);
501 ngx_add_timer(ev, timer * 1000);
502
503 return NGX_OK;
440 } 504 }
441 505
442 int ngx_http_internal_redirect(ngx_http_request_t *r, char *uri) 506 int ngx_http_internal_redirect(ngx_http_request_t *r, char *uri)
443 { 507 {
444 ngx_log_debug(r->connection->log, "internal redirect: '%s'" _ uri); 508 ngx_log_debug(r->connection->log, "internal redirect: '%s'" _ uri);
541 if (rc == NGX_ERROR) 605 if (rc == NGX_ERROR)
542 return rc; 606 return rc;
543 607
544 /* rc == NGX_OK */ 608 /* rc == NGX_OK */
545 609
546 return ngx_http_close_request(r); 610 ngx_log_debug(ev->log, "ngx_http_writer done");
547 611
548 /* 612 if (!r->keepalive) {
549 if (!keepalive) 613 if (r->lingering_close) {
550 if (linger) 614 r->lingering_time = ngx_time() + SOME_LINGERING_TIME;
551 shutdown socket 615 r->connection->read->event_handler = ngx_http_lingering_close;
552 else 616 ngx_del_timer(r->connection->read);
553 close socket 617 ngx_add_timer(r->connection->read, LINGERING_TIMEOUT * 1000);
554 618 if (ngx_add_event(r->connection->read, NGX_READ_EVENT,
555 log http request 619 NGX_ONESHOT_EVENT) == NGX_ERROR) {
556 close http request 620 return ngx_http_close_request(r);
557 if (keepalive) 621 }
558 return NGX_OK; 622 if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN)
559 else 623 == NGX_ERROR)
560 close connection 624 {
561 return NGX_OK; 625 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno,
562 */ 626 ngx_shutdown_socket_n " failed");
627 return ngx_http_close_request(r);
628 }
629 } else {
630 return ngx_http_close_request(r);
631 }
632 }
633
634 /* keepalive */
635 ev = r->connection->read;
636 ngx_http_close_request(r);
637 ev->event_handler = ngx_http_init_request;
563 } 638 }
564 639
565 #if 0 640 #if 0
566 641
567 static int ngx_http_keepalive_handler(ngx_event_t *ev) 642 static int ngx_http_keepalive_handler(ngx_event_t *ev)
670 745
671 #endif 746 #endif
672 747
673 static int ngx_http_close_request(ngx_http_request_t *r) 748 static int ngx_http_close_request(ngx_http_request_t *r)
674 { 749 {
750 /*
751 if (r->logging)
752 ngx_http_log_request(r);
753 */
754
675 ngx_destroy_pool(r->pool); 755 ngx_destroy_pool(r->pool);
676 756
677 ngx_log_debug(r->connection->log, "http close"); 757 ngx_log_debug(r->connection->log, "http close");
678 758
679 ngx_del_timer(r->connection->read); 759 ngx_del_timer(r->connection->read);
680 ngx_del_timer(r->connection->write); 760 ngx_del_timer(r->connection->write);
681 761
682 return NGX_ERROR; 762 return NGX_DONE;
683 } 763 }
684 764
685 765
686 static size_t ngx_http_log_error(void *data, char *buf, size_t len) 766 static size_t ngx_http_log_error(void *data, char *buf, size_t len)
687 { 767 {