Mercurial > hg > nginx-quic
comparison src/http/ngx_http_event.c @ 44:0e81ac0bb3e2
nginx-0.0.1-2003-01-09-08:36:00 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 09 Jan 2003 05:36:00 +0000 |
parents | 59e7c7f30d49 |
children | f1ee46c036a4 |
comparison
equal
deleted
inserted
replaced
43:53cd05892261 | 44:0e81ac0bb3e2 |
---|---|
10 #include <ngx_hunk.h> | 10 #include <ngx_hunk.h> |
11 #include <ngx_connection.h> | 11 #include <ngx_connection.h> |
12 #include <ngx_inet.h> | 12 #include <ngx_inet.h> |
13 #include <ngx_http.h> | 13 #include <ngx_http.h> |
14 #include <ngx_http_config.h> | 14 #include <ngx_http_config.h> |
15 #include <ngx_http_core.h> | 15 #include <ngx_http_core_module.h> |
16 | 16 |
17 /* STUB */ | 17 /* STUB */ |
18 #include <ngx_http_output_filter.h> | 18 #include <ngx_http_output_filter.h> |
19 int ngx_http_static_handler(ngx_http_request_t *r); | 19 int ngx_http_static_handler(ngx_http_request_t *r); |
20 int ngx_http_index_handler(ngx_http_request_t *r); | 20 int ngx_http_index_handler(ngx_http_request_t *r); |
73 | 73 |
74 int ngx_http_init_connection(ngx_connection_t *c) | 74 int ngx_http_init_connection(ngx_connection_t *c) |
75 { | 75 { |
76 ngx_event_t *ev; | 76 ngx_event_t *ev; |
77 struct sockaddr *addr; | 77 struct sockaddr *addr; |
78 ngx_http_server_t *srv; | |
79 ngx_http_log_ctx_t *ctx; | 78 ngx_http_log_ctx_t *ctx; |
80 | 79 |
81 ev = c->read; | 80 ev = c->read; |
82 ev->event_handler = ngx_http_init_request; | 81 ev->event_handler = ngx_http_init_request; |
83 | 82 |
84 srv = (ngx_http_server_t *) c->server; | |
85 | |
86 ngx_test_null(c->pool, | 83 ngx_test_null(c->pool, |
87 ngx_create_pool(srv->connection_pool_size, ev->log), | 84 ngx_create_pool(ngx_http_connection_pool_size, ev->log), |
88 NGX_ERROR); | 85 NGX_ERROR); |
89 | 86 |
90 ngx_test_null(c->requests, ngx_create_array(c->pool, 10, sizeof(char *)), | 87 ngx_test_null(c->requests, ngx_create_array(c->pool, 10, sizeof(char *)), |
91 NGX_ERROR); | 88 NGX_ERROR); |
92 | 89 |
95 | 92 |
96 ngx_test_null(addr, ngx_palloc(c->pool, c->socklen), NGX_ERROR); | 93 ngx_test_null(addr, ngx_palloc(c->pool, c->socklen), NGX_ERROR); |
97 ngx_memcpy(addr, c->sockaddr, c->socklen); | 94 ngx_memcpy(addr, c->sockaddr, c->socklen); |
98 c->sockaddr = addr; | 95 c->sockaddr = addr; |
99 | 96 |
100 ngx_test_null(c->addr_text.data, ngx_palloc(c->pool, c->addr_text.len), | 97 ngx_test_null(c->addr_text.data, ngx_palloc(c->pool, c->addr_text_max_len), |
101 NGX_ERROR); | 98 NGX_ERROR); |
102 | 99 |
103 c->addr_text.len = ngx_inet_ntop(c->family, | 100 c->addr_text.len = ngx_inet_ntop(c->family, |
104 (char *)c->sockaddr + c->addr, | 101 (char *)c->sockaddr + c->addr, |
105 c->addr_text.data, c->addr_text.len); | 102 c->addr_text.data, c->addr_text_max_len); |
106 if (c->addr_text.len == 0) | 103 if (c->addr_text.len == 0) |
107 return NGX_ERROR; | 104 return NGX_ERROR; |
108 | 105 |
109 ngx_test_null(ctx, ngx_pcalloc(c->pool, sizeof(ngx_http_log_ctx_t)), | 106 ngx_test_null(ctx, ngx_pcalloc(c->pool, sizeof(ngx_http_log_ctx_t)), |
110 NGX_ERROR); | 107 NGX_ERROR); |
116 #if (HAVE_DEFERRED_ACCEPT) | 113 #if (HAVE_DEFERRED_ACCEPT) |
117 if (ev->ready) { | 114 if (ev->ready) { |
118 return ngx_http_init_request(ev); | 115 return ngx_http_init_request(ev); |
119 } else { | 116 } else { |
120 #endif | 117 #endif |
121 /* STUB: post_accept_timeout should be in http_conf */ | |
122 ngx_add_timer(ev, c->post_accept_timeout); | 118 ngx_add_timer(ev, c->post_accept_timeout); |
123 #if (USE_KQUEUE) | 119 #if (USE_KQUEUE) |
124 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); | 120 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); |
125 #else | 121 #else |
126 #if (HAVE_AIO_EVENT) | 122 #if (HAVE_AIO_EVENT) |
141 } | 137 } |
142 | 138 |
143 | 139 |
144 static int ngx_http_init_request(ngx_event_t *ev) | 140 static int ngx_http_init_request(ngx_event_t *ev) |
145 { | 141 { |
146 ngx_connection_t *c; | 142 ngx_connection_t *c; |
147 ngx_http_server_t *srv; | 143 ngx_http_request_t *r; |
148 ngx_http_request_t *r; | |
149 | 144 |
150 c = (ngx_connection_t *) ev->data; | 145 c = (ngx_connection_t *) ev->data; |
151 srv = (ngx_http_server_t *) c->server; | |
152 | 146 |
153 ngx_test_null(r, ngx_pcalloc(c->pool, sizeof(ngx_http_request_t)), | 147 ngx_test_null(r, ngx_pcalloc(c->pool, sizeof(ngx_http_request_t)), |
154 NGX_ERROR); | 148 NGX_ERROR); |
155 | 149 |
156 c->data = r; | 150 c->data = r; |
157 r->connection = c; | 151 r->connection = c; |
158 r->server = srv; | |
159 r->file.fd = NGX_INVALID_FILE; | 152 r->file.fd = NGX_INVALID_FILE; |
160 | |
161 /* STUB */ | |
162 r->srv_conf = ngx_srv_conf; | |
163 r->loc_conf = ngx_loc_conf; | |
164 /**/ | |
165 | 153 |
166 if (c->buffer == NULL) { | 154 if (c->buffer == NULL) { |
167 ngx_test_null(c->buffer, | 155 ngx_test_null(c->buffer, |
168 ngx_create_temp_hunk(c->pool, srv->header_buffer_size, | 156 ngx_create_temp_hunk(c->pool, |
157 ngx_http_client_header_buffer_size, | |
169 0, 0), | 158 0, 0), |
170 NGX_ERROR); | 159 NGX_ERROR); |
171 } else { | 160 } else { |
172 r->header_read = 1; | 161 r->header_read = 1; |
173 } | 162 } |
174 | 163 |
175 r->header_in = c->buffer; | 164 r->header_in = c->buffer; |
176 | 165 |
177 ngx_test_null(r->pool, ngx_create_pool(srv->request_pool_size, ev->log), | 166 ngx_test_null(r->pool, ngx_create_pool(ngx_http_request_pool_size, ev->log), |
178 ngx_http_close_request(r)); | 167 ngx_http_close_request(r)); |
179 | 168 |
180 ngx_test_null(r->ctx, | 169 ngx_test_null(r->ctx, |
181 ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module), | 170 ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module), |
182 ngx_http_close_request(r)); | 171 ngx_http_close_request(r)); |
216 | 205 |
217 if (n == NGX_AGAIN) { | 206 if (n == NGX_AGAIN) { |
218 if (r->header_timeout) { | 207 if (r->header_timeout) { |
219 r->header_timeout = 0; | 208 r->header_timeout = 0; |
220 ngx_del_timer(ev); | 209 ngx_del_timer(ev); |
221 /* STUB: r->server->header_timeout | 210 ngx_add_timer(ev, ngx_http_client_header_timeout); |
222 OR r->srv_conf->header_timeout ? */ | |
223 ngx_add_timer(ev, r->server->header_timeout); | |
224 } | 211 } |
225 return NGX_AGAIN; | 212 return NGX_AGAIN; |
226 } | 213 } |
227 | 214 |
228 if (n == NGX_ERROR) | 215 if (n == NGX_ERROR) |
252 } while (rc == NGX_AGAIN && r->header_in->pos.mem < r->header_in->last.mem); | 239 } while (rc == NGX_AGAIN && r->header_in->pos.mem < r->header_in->last.mem); |
253 | 240 |
254 if (r->header_timeout) { | 241 if (r->header_timeout) { |
255 r->header_timeout = 0; | 242 r->header_timeout = 0; |
256 ngx_del_timer(ev); | 243 ngx_del_timer(ev); |
257 ngx_add_timer(ev, r->server->header_timeout); | 244 ngx_add_timer(ev, ngx_http_client_header_timeout); |
258 } | 245 } |
259 | 246 |
260 if (rc == NGX_OK) | 247 if (rc == NGX_OK) |
261 return ngx_http_event_request_handler(r); | 248 return ngx_http_event_request_handler(r); |
262 else | 249 else |
589 | 576 |
590 static int ngx_http_read_discarded_body(ngx_event_t *ev) | 577 static int ngx_http_read_discarded_body(ngx_event_t *ev) |
591 { | 578 { |
592 size_t size; | 579 size_t size; |
593 ssize_t n; | 580 ssize_t n; |
594 ngx_connection_t *c; | 581 ngx_connection_t *c; |
595 ngx_http_request_t *r; | 582 ngx_http_request_t *r; |
583 ngx_http_core_loc_conf_t *lcf; | |
584 | |
585 ngx_log_debug(ev->log, "http read discarded body"); | |
586 | |
587 if (ev->timedout) | |
588 return NGX_ERROR; | |
596 | 589 |
597 c = (ngx_connection_t *) ev->data; | 590 c = (ngx_connection_t *) ev->data; |
598 r = (ngx_http_request_t *) c->data; | 591 r = (ngx_http_request_t *) c->data; |
599 | 592 |
600 ngx_log_debug(ev->log, "http read discarded body"); | 593 lcf = (ngx_http_core_loc_conf_t *) |
601 | 594 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); |
602 if (ev->timedout) | |
603 return NGX_ERROR; | |
604 | 595 |
605 if (r->discarded_buffer == NULL) | 596 if (r->discarded_buffer == NULL) |
606 ngx_test_null(r->discarded_buffer, | 597 ngx_test_null(r->discarded_buffer, |
607 ngx_palloc(r->pool, r->server->discarded_buffer_size), | 598 ngx_palloc(r->pool, lcf->discarded_buffer_size), |
608 NGX_ERROR); | 599 NGX_ERROR); |
609 | 600 |
610 size = r->client_content_length; | 601 size = r->client_content_length; |
611 if (size > r->server->discarded_buffer_size) | 602 if (size > lcf->discarded_buffer_size) |
612 size = r->server->discarded_buffer_size; | 603 size = lcf->discarded_buffer_size; |
613 | 604 |
614 n = ngx_event_recv(c, r->discarded_buffer, size); | 605 n = ngx_event_recv(c, r->discarded_buffer, size); |
615 if (n == NGX_ERROR) | 606 if (n == NGX_ERROR) |
616 return NGX_ERROR; | 607 return NGX_ERROR; |
617 | 608 |
620 | 611 |
621 r->client_content_length -= n; | 612 r->client_content_length -= n; |
622 /* XXX: what if r->client_content_length == 0 ? */ | 613 /* XXX: what if r->client_content_length == 0 ? */ |
623 return NGX_OK; | 614 return NGX_OK; |
624 } | 615 } |
625 | |
626 | |
627 #if 0 | |
628 static int ngx_http_discarded_read(ngx_event_t *ev) | |
629 { | |
630 ssize_t n; | |
631 ngx_connection_t *c; | |
632 ngx_http_request_t *r; | |
633 | |
634 c = (ngx_connection_t *) ev->data; | |
635 r = (ngx_http_request_t *) c->data; | |
636 | |
637 ngx_log_debug(ev->log, "http discarded read"); | |
638 | |
639 if (ev->timedout) | |
640 return NGX_ERROR; | |
641 | |
642 if (r->discarded_buffer == NULL) | |
643 ngx_test_null(r->discarded_buffer, | |
644 ngx_palloc(r->pool, r->server->discarded_buffer_size), | |
645 NGX_ERROR); | |
646 | |
647 n = ngx_event_recv(c, r->discarded_buffer, | |
648 r->server->discarded_buffer_size); | |
649 | |
650 return n; | |
651 } | |
652 #endif | |
653 | 616 |
654 | 617 |
655 static int ngx_http_keepalive_handler(ngx_event_t *ev) | 618 static int ngx_http_keepalive_handler(ngx_event_t *ev) |
656 { | 619 { |
657 ssize_t n; | 620 ssize_t n; |
688 } | 651 } |
689 | 652 |
690 | 653 |
691 static int ngx_http_set_lingering_close(ngx_http_request_t *r) | 654 static int ngx_http_set_lingering_close(ngx_http_request_t *r) |
692 { | 655 { |
693 r->lingering_time = ngx_time() + r->server->lingering_time; | 656 ngx_http_core_loc_conf_t *lcf; |
657 | |
658 lcf = (ngx_http_core_loc_conf_t *) | |
659 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); | |
660 | |
661 r->lingering_time = ngx_time() + lcf->lingering_time; | |
694 r->connection->read->event_handler = ngx_http_lingering_close_handler; | 662 r->connection->read->event_handler = ngx_http_lingering_close_handler; |
695 | 663 |
696 ngx_del_timer(r->connection->read); | 664 ngx_del_timer(r->connection->read); |
697 ngx_add_timer(r->connection->read, r->server->lingering_timeout); | 665 ngx_add_timer(r->connection->read, lcf->lingering_timeout); |
698 | 666 |
699 if (r->connection->read->blocked) { | 667 if (r->connection->read->blocked) { |
700 if (ngx_add_event(r->connection->read, NGX_READ_EVENT, | 668 if (ngx_add_event(r->connection->read, NGX_READ_EVENT, |
701 #if (HAVE_CLEAR_EVENT) | 669 #if (HAVE_CLEAR_EVENT) |
702 NGX_CLEAR_EVENT) == NGX_ERROR) | 670 NGX_CLEAR_EVENT) == NGX_ERROR) |
723 { | 691 { |
724 ssize_t n; | 692 ssize_t n; |
725 ngx_msec_t timer; | 693 ngx_msec_t timer; |
726 ngx_connection_t *c; | 694 ngx_connection_t *c; |
727 ngx_http_request_t *r; | 695 ngx_http_request_t *r; |
696 ngx_http_core_loc_conf_t *lcf; | |
697 | |
698 ngx_log_debug(ev->log, "http lingering close handler"); | |
699 | |
700 if (ev->timedout) { | |
701 return ngx_http_close_request(r); | |
702 } | |
728 | 703 |
729 c = (ngx_connection_t *) ev->data; | 704 c = (ngx_connection_t *) ev->data; |
730 r = (ngx_http_request_t *) c->data; | 705 r = (ngx_http_request_t *) c->data; |
731 | |
732 ngx_log_debug(ev->log, "http lingering close handler"); | |
733 | |
734 if (ev->timedout) { | |
735 return ngx_http_close_request(r); | |
736 } | |
737 | 706 |
738 timer = r->lingering_time - ngx_time(); | 707 timer = r->lingering_time - ngx_time(); |
739 if (timer <= 0) { | 708 if (timer <= 0) { |
740 return ngx_http_close_request(r); | 709 return ngx_http_close_request(r); |
741 } | 710 } |
742 | 711 |
712 lcf = (ngx_http_core_loc_conf_t *) | |
713 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); | |
714 | |
743 if (r->discarded_buffer == NULL) { | 715 if (r->discarded_buffer == NULL) { |
744 if (r->header_in->end - r->header_in->last.mem | 716 if (r->header_in->end - r->header_in->last.mem |
745 >= r->server->discarded_buffer_size) { | 717 >= lcf->discarded_buffer_size) { |
746 r->discarded_buffer = r->header_in->last.mem; | 718 r->discarded_buffer = r->header_in->last.mem; |
747 | 719 |
748 } else { | 720 } else { |
749 ngx_test_null(r->discarded_buffer, | 721 ngx_test_null(r->discarded_buffer, |
750 ngx_palloc(c->pool, r->server->discarded_buffer_size), | 722 ngx_palloc(c->pool, lcf->discarded_buffer_size), |
751 ngx_http_close_request(r)); | 723 ngx_http_close_request(r)); |
752 } | 724 } |
753 } | 725 } |
754 | 726 |
755 n = ngx_event_recv(c, r->discarded_buffer, | 727 n = ngx_event_recv(c, r->discarded_buffer, lcf->discarded_buffer_size); |
756 r->server->discarded_buffer_size); | |
757 | 728 |
758 ngx_log_debug(ev->log, "lingering read: %d" _ n); | 729 ngx_log_debug(ev->log, "lingering read: %d" _ n); |
759 | 730 |
760 if (n == NGX_ERROR || n == 0) { | 731 if (n == NGX_ERROR || n == 0) { |
761 return ngx_http_close_request(r); | 732 return ngx_http_close_request(r); |
762 } | 733 } |
763 | 734 |
764 timer *= 1000; | 735 timer *= 1000; |
765 if (timer > r->server->lingering_timeout) { | 736 if (timer > lcf->lingering_timeout) { |
766 timer = r->server->lingering_timeout; | 737 timer = lcf->lingering_timeout; |
767 } | 738 } |
768 | 739 |
769 ngx_del_timer(ev); | 740 ngx_del_timer(ev); |
770 ngx_add_timer(ev, timer); | 741 ngx_add_timer(ev, timer); |
771 | 742 |