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