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