Mercurial > hg > nginx-quic
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 { |