Mercurial > hg > nginx
comparison src/http/ngx_http_event.c @ 53:d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 26 Jan 2003 21:08:14 +0000 |
parents | 9f2728644651 |
children | 27b628ef907e |
comparison
equal
deleted
inserted
replaced
52:9f2728644651 | 53:d1e42f1b8fd4 |
---|---|
113 c->log->handler = ngx_http_log_error; | 113 c->log->handler = ngx_http_log_error; |
114 | 114 |
115 #if (HAVE_DEFERRED_ACCEPT) | 115 #if (HAVE_DEFERRED_ACCEPT) |
116 if (ev->ready) { | 116 if (ev->ready) { |
117 return ngx_http_init_request(ev); | 117 return ngx_http_init_request(ev); |
118 } else { | 118 } |
119 #endif | 119 #endif |
120 ngx_add_timer(ev, c->post_accept_timeout); | 120 |
121 ngx_add_timer(ev, c->post_accept_timeout); | |
122 ev->timer_set = 1; | |
123 | |
121 #if (USE_KQUEUE) | 124 #if (USE_KQUEUE) |
125 | |
126 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); | |
127 | |
128 #else | |
129 | |
130 #if (HAVE_CLEAR_EVENT) | |
131 if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { | |
122 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); | 132 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); |
123 #else | 133 } |
134 #endif | |
135 | |
124 #if (HAVE_AIO_EVENT) | 136 #if (HAVE_AIO_EVENT) |
125 if (ngx_event_type == NGX_AIO_EVENT) | 137 if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { |
126 return ngx_http_init_request(ev); | 138 return ngx_http_init_request(ev); |
127 else | 139 } |
128 #endif | 140 #endif |
129 #if (HAVE_CLEAR_EVENT) | 141 |
130 if (ngx_event_type == NGX_KQUEUE_EVENT) | 142 return ngx_add_event(ev, NGX_READ_EVENT, NGX_LEVEL_EVENT); |
131 return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); | 143 |
132 else | |
133 #endif | |
134 return ngx_add_event(ev, NGX_READ_EVENT, NGX_LEVEL_EVENT); | |
135 #endif /* USE_KQUEUE */ | 144 #endif /* USE_KQUEUE */ |
136 #if (HAVE_DEFERRED_ACCEPT) | |
137 } | |
138 #endif | |
139 } | 145 } |
140 | 146 |
141 | 147 |
142 static int ngx_http_init_request(ngx_event_t *ev) | 148 static int ngx_http_init_request(ngx_event_t *ev) |
143 { | 149 { |
144 ngx_connection_t *c; | 150 ngx_connection_t *c; |
145 ngx_http_request_t *r; | 151 ngx_http_request_t *r; |
146 | 152 |
147 c = (ngx_connection_t *) ev->data; | 153 c = (ngx_connection_t *) ev->data; |
148 c->sent = 0; | 154 c->sent = 0; |
149 | 155 |
150 ngx_test_null(r, ngx_pcalloc(c->pool, sizeof(ngx_http_request_t)), | 156 ngx_test_null(r, ngx_pcalloc(c->pool, sizeof(ngx_http_request_t)), |
177 r->headers_out.content_length = -1; | 183 r->headers_out.content_length = -1; |
178 r->headers_out.last_modified_time = -1; | 184 r->headers_out.last_modified_time = -1; |
179 | 185 |
180 ev->event_handler = ngx_http_process_request_header; | 186 ev->event_handler = ngx_http_process_request_header; |
181 r->state_handler = ngx_http_process_request_line; | 187 r->state_handler = ngx_http_process_request_line; |
182 r->header_timeout = 1; | |
183 | 188 |
184 return ngx_http_process_request_header(ev); | 189 return ngx_http_process_request_header(ev); |
185 } | 190 } |
186 | 191 |
187 | 192 |
188 static int ngx_http_process_request_header(ngx_event_t *ev) | 193 static int ngx_http_process_request_header(ngx_event_t *ev) |
189 { | 194 { |
190 int n, rc; | 195 int n, rc; |
191 ngx_connection_t *c ; | 196 ngx_connection_t *c; |
192 ngx_http_request_t *r; | 197 ngx_http_request_t *r; |
193 ngx_http_log_ctx_t *ctx; | 198 ngx_http_log_ctx_t *ctx; |
194 | 199 |
195 c = (ngx_connection_t *) ev->data; | 200 c = (ngx_connection_t *) ev->data; |
196 r = (ngx_http_request_t *) c->data; | 201 r = (ngx_http_request_t *) c->data; |
197 | 202 |
205 } else { | 210 } else { |
206 n = ngx_event_recv(c, r->header_in->last.mem, | 211 n = ngx_event_recv(c, r->header_in->last.mem, |
207 r->header_in->end - r->header_in->last.mem); | 212 r->header_in->end - r->header_in->last.mem); |
208 | 213 |
209 if (n == NGX_AGAIN) { | 214 if (n == NGX_AGAIN) { |
210 if (r->header_timeout) { | 215 if (!r->header_timeout_set) { |
211 r->header_timeout = 0; | 216 |
212 ngx_del_timer(ev); | 217 if (ev->timer_set) { |
218 ngx_del_timer(ev); | |
219 } else { | |
220 ev->timer_set = 1; | |
221 } | |
222 | |
213 ngx_add_timer(ev, ngx_http_client_header_timeout); | 223 ngx_add_timer(ev, ngx_http_client_header_timeout); |
224 r->header_timeout_set = 1; | |
214 } | 225 } |
215 return NGX_AGAIN; | 226 return NGX_AGAIN; |
216 } | 227 } |
217 | 228 |
218 if (n == NGX_ERROR) | 229 if (n == NGX_ERROR) |
242 } while (rc == NGX_AGAIN && r->header_in->pos.mem < r->header_in->last.mem); | 253 } while (rc == NGX_AGAIN && r->header_in->pos.mem < r->header_in->last.mem); |
243 | 254 |
244 if (rc == NGX_OK) { | 255 if (rc == NGX_OK) { |
245 /* HTTP header done */ | 256 /* HTTP header done */ |
246 | 257 |
247 if (r->header_timeout) { | 258 if (ev->timer_set) { |
248 r->header_timeout = 0; | |
249 ngx_del_timer(ev); | 259 ngx_del_timer(ev); |
260 ev->timer_set = 0; | |
261 } | |
262 | |
263 return ngx_http_event_request_handler(r); | |
264 | |
265 } else { /* NGX_AGAIN */ | |
266 | |
267 if (!r->header_timeout_set) { | |
268 | |
269 if (ev->timer_set) { | |
270 ngx_del_timer(ev); | |
271 } else { | |
272 ev->timer_set = 1; | |
273 } | |
274 | |
250 ngx_add_timer(ev, ngx_http_client_header_timeout); | 275 ngx_add_timer(ev, ngx_http_client_header_timeout); |
251 } | 276 r->header_timeout_set = 1; |
252 | |
253 return ngx_http_event_request_handler(r); | |
254 | |
255 } else { | |
256 | |
257 if (r->header_timeout) { | |
258 r->header_timeout = 0; | |
259 ngx_del_timer(ev); | |
260 ngx_add_timer(ev, ngx_http_client_header_timeout); | |
261 } | 277 } |
262 | 278 |
263 return rc; | 279 return rc; |
264 } | 280 } |
265 } | 281 } |
428 } | 444 } |
429 | 445 |
430 | 446 |
431 static int ngx_http_event_request_handler(ngx_http_request_t *r) | 447 static int ngx_http_event_request_handler(ngx_http_request_t *r) |
432 { | 448 { |
433 int rc; | 449 int rc; |
434 ngx_msec_t timeout; | 450 ngx_msec_t timeout; |
435 | 451 ngx_event_t *rev, *wev; |
436 ngx_del_timer(r->connection->read); | 452 |
437 r->header_timeout = 0; | 453 rev = r->connection->read; |
454 wev = r->connection->write; | |
455 | |
456 if (rev->timer_set) { | |
457 ngx_del_timer(rev); | |
458 rev->timer_set = 0; | |
459 } | |
438 | 460 |
439 r->state_handler = NULL; | 461 r->state_handler = NULL; |
440 r->connection->read->event_handler = ngx_http_block_read; | 462 rev->event_handler = ngx_http_block_read; |
441 | 463 |
442 rc = ngx_http_handler(r); | 464 rc = ngx_http_handler(r); |
443 | 465 |
444 /* handler is still busy */ | 466 /* handler is still busy */ |
445 if (rc == NGX_WAITING) | 467 if (rc == NGX_WAITING) |
446 return rc; | 468 return rc; |
447 | 469 |
448 /* handler has done its work but transfer is not completed */ | 470 /* handler has done its work but transfer is not completed */ |
449 if (rc == NGX_AGAIN) { | 471 if (rc == NGX_AGAIN) { |
450 #if (HAVE_CLEAR_EVENT) | 472 #if (HAVE_CLEAR_EVENT) |
451 if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, | 473 if (ngx_add_event(wev, NGX_WRITE_EVENT, |
452 NGX_CLEAR_EVENT) == NGX_ERROR) { | 474 NGX_CLEAR_EVENT) == NGX_ERROR) { |
453 #else | 475 #else |
454 if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, | 476 if (ngx_add_event(wev, NGX_WRITE_EVENT, |
455 NGX_ONESHOT_EVENT) == NGX_ERROR) { | 477 NGX_ONESHOT_EVENT) == NGX_ERROR) { |
456 #endif | 478 #endif |
457 return ngx_http_close_request(r); | 479 return ngx_http_close_request(r); |
458 } | 480 } |
459 | 481 |
460 if (r->connection->sent > 0) { | 482 if (r->connection->sent > 0) { |
461 ngx_log_debug(r->connection->log, "sent: " QD_FMT _ | 483 ngx_log_debug(r->connection->log, "sent: " QD_FMT _ |
462 r->connection->sent); | 484 r->connection->sent); |
463 timeout = (ngx_msec_t) (r->connection->sent * 10); | 485 timeout = (ngx_msec_t) (r->connection->sent * 10); |
464 ngx_log_debug(r->connection->log, "timeout: %d" _ timeout); | 486 ngx_log_debug(r->connection->log, "timeout: %d" _ timeout); |
465 ngx_add_timer(r->connection->write, timeout); | 487 ngx_add_timer(wev, timeout); |
466 | 488 |
467 } else { | 489 } else { |
468 ngx_add_timer(r->connection->write, 10000); | 490 ngx_add_timer(wev, 10000); |
469 } | 491 } |
470 | 492 |
471 r->connection->write->event_handler = ngx_http_writer; | 493 wev->event_handler = ngx_http_writer; |
472 return rc; | 494 return rc; |
473 } | 495 } |
474 | 496 |
475 if (rc == NGX_ERROR) { | 497 if (rc == NGX_ERROR) { |
476 /* log http request */ | 498 /* log http request */ |
494 /* keepalive */ | 516 /* keepalive */ |
495 | 517 |
496 ngx_http_close_request(r); | 518 ngx_http_close_request(r); |
497 r->connection->buffer->pos.mem = r->connection->buffer->last.mem | 519 r->connection->buffer->pos.mem = r->connection->buffer->last.mem |
498 = r->connection->buffer->start; | 520 = r->connection->buffer->start; |
499 r->connection->read->event_handler = ngx_http_keepalive_handler; | 521 rev->event_handler = ngx_http_keepalive_handler; |
500 } | 522 } |
501 | 523 |
502 | 524 |
503 static int ngx_http_writer(ngx_event_t *ev) | 525 static int ngx_http_writer(ngx_event_t *ev) |
504 { | 526 { |
525 timeout = (ngx_msec_t) (c->sent * conf->send_timeout); | 547 timeout = (ngx_msec_t) (c->sent * conf->send_timeout); |
526 | 548 |
527 ngx_log_debug(ev->log, "sent: " QD_FMT _ c->sent); | 549 ngx_log_debug(ev->log, "sent: " QD_FMT _ c->sent); |
528 ngx_log_debug(ev->log, "timeout: %d" _ timeout); | 550 ngx_log_debug(ev->log, "timeout: %d" _ timeout); |
529 | 551 |
530 ngx_del_timer(ev); | 552 if (ev->timer_set) { |
553 ngx_del_timer(ev); | |
554 } else { | |
555 ev->timer_set = 1; | |
556 } | |
557 | |
531 ngx_add_timer(ev, timeout); | 558 ngx_add_timer(ev, timeout); |
532 } | 559 } |
533 | 560 |
534 if (ev->oneshot) | 561 if (ev->oneshot) |
535 if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, | 562 if (ngx_add_event(ev, NGX_WRITE_EVENT, |
536 NGX_ONESHOT_EVENT) == NGX_ERROR) { | 563 NGX_ONESHOT_EVENT) == NGX_ERROR) { |
537 return ngx_http_close_request(r); | 564 return ngx_http_close_request(r); |
538 } | 565 } |
539 | 566 |
540 return rc; | 567 return rc; |
573 } | 600 } |
574 | 601 |
575 | 602 |
576 int ngx_http_discard_body(ngx_http_request_t *r) | 603 int ngx_http_discard_body(ngx_http_request_t *r) |
577 { | 604 { |
605 ngx_event_t *ev; | |
606 | |
607 ev = r->connection->read; | |
608 | |
578 ngx_log_debug(r->connection->log, "set discard body"); | 609 ngx_log_debug(r->connection->log, "set discard body"); |
579 | 610 |
580 ngx_del_timer(r->connection->read); | 611 if (ev->timer_set) { |
612 ngx_del_timer(ev); | |
613 ev->timer_set = 0; | |
614 } | |
581 | 615 |
582 if (r->client_content_length) | 616 if (r->client_content_length) |
583 r->connection->read->event_handler = ngx_http_read_discarded_body; | 617 ev->event_handler = ngx_http_read_discarded_body; |
584 | 618 |
585 return NGX_OK; | 619 return NGX_OK; |
586 } | 620 } |
587 | 621 |
588 | 622 |
663 } | 697 } |
664 | 698 |
665 | 699 |
666 static int ngx_http_set_lingering_close(ngx_http_request_t *r) | 700 static int ngx_http_set_lingering_close(ngx_http_request_t *r) |
667 { | 701 { |
702 ngx_event_t *ev; | |
668 ngx_http_core_loc_conf_t *lcf; | 703 ngx_http_core_loc_conf_t *lcf; |
704 | |
705 ev = r->connection->read; | |
669 | 706 |
670 lcf = (ngx_http_core_loc_conf_t *) | 707 lcf = (ngx_http_core_loc_conf_t *) |
671 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); | 708 ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); |
672 | 709 |
673 r->lingering_time = ngx_time() + lcf->lingering_time; | 710 r->lingering_time = ngx_time() + lcf->lingering_time; |
674 r->connection->read->event_handler = ngx_http_lingering_close_handler; | 711 r->connection->read->event_handler = ngx_http_lingering_close_handler; |
675 | 712 |
676 ngx_del_timer(r->connection->read); | 713 if (ev->timer_set) { |
677 ngx_add_timer(r->connection->read, lcf->lingering_timeout); | 714 ngx_del_timer(ev); |
678 | 715 } else { |
679 if (r->connection->read->blocked) { | 716 ev->timer_set = 1; |
680 if (ngx_add_event(r->connection->read, NGX_READ_EVENT, | 717 } |
718 | |
719 ngx_add_timer(ev, lcf->lingering_timeout); | |
720 | |
721 if (ev->blocked) { | |
722 if (ngx_add_event(ev, NGX_READ_EVENT, | |
681 #if (HAVE_CLEAR_EVENT) | 723 #if (HAVE_CLEAR_EVENT) |
682 NGX_CLEAR_EVENT) == NGX_ERROR) | 724 NGX_CLEAR_EVENT) == NGX_ERROR) |
683 #else | 725 #else |
684 NGX_ONESHOT_EVENT) == NGX_ERROR) | 726 NGX_ONESHOT_EVENT) == NGX_ERROR) |
685 #endif | 727 #endif |
686 { | 728 { |
687 return ngx_http_close_request(r); | 729 return ngx_http_close_request(r); |
688 } | 730 } |
689 } | 731 } |
690 | 732 |
691 if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN) == -1) | 733 if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN) == -1) { |
692 { | |
693 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno, | 734 ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno, |
694 ngx_shutdown_socket_n " failed"); | 735 ngx_shutdown_socket_n " failed"); |
695 return ngx_http_close_request(r); | 736 return ngx_http_close_request(r); |
696 } | 737 } |
697 | 738 |
747 timer *= 1000; | 788 timer *= 1000; |
748 if (timer > lcf->lingering_timeout) { | 789 if (timer > lcf->lingering_timeout) { |
749 timer = lcf->lingering_timeout; | 790 timer = lcf->lingering_timeout; |
750 } | 791 } |
751 | 792 |
752 ngx_del_timer(ev); | 793 if (ev->timer_set) { |
794 ngx_del_timer(ev); | |
795 } else { | |
796 ev->timer_set = 1; | |
797 } | |
753 ngx_add_timer(ev, timer); | 798 ngx_add_timer(ev, timer); |
754 | 799 |
755 return NGX_OK; | 800 return NGX_OK; |
756 } | 801 } |
757 | 802 |