Mercurial > hg > nginx
comparison src/http/ngx_http_event.c @ 103:6dfda4cf5200
nginx-0.0.1-2003-06-11-19:28:34 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 11 Jun 2003 15:28:34 +0000 |
parents | 2e069b6e6920 |
children | 7db96f59bc29 |
comparison
equal
deleted
inserted
replaced
102:7e86d028d8f0 | 103:6dfda4cf5200 |
---|---|
65 { | 65 { |
66 int event; | 66 int event; |
67 ngx_event_t *rev; | 67 ngx_event_t *rev; |
68 ngx_http_log_ctx_t *lcx; | 68 ngx_http_log_ctx_t *lcx; |
69 | 69 |
70 c->addr_text.data = ngx_palloc(c->pool, c->addr_text_max_len); | 70 c->addr_text.data = ngx_palloc(c->pool, c->listening->addr_text_max_len); |
71 if (c->addr_text.data == NULL) { | 71 if (c->addr_text.data == NULL) { |
72 ngx_http_close_connection(c); | 72 ngx_http_close_connection(c); |
73 return; | 73 return; |
74 } | 74 } |
75 | 75 |
76 c->addr_text.len = ngx_sock_ntop(c->family, c->sockaddr, | 76 c->addr_text.len = ngx_sock_ntop(c->listening->family, c->sockaddr, |
77 c->addr_text.data, c->addr_text_max_len); | 77 c->addr_text.data, |
78 c->listening->addr_text_max_len); | |
78 if (c->addr_text.len == 0) { | 79 if (c->addr_text.len == 0) { |
79 ngx_http_close_connection(c); | 80 ngx_http_close_connection(c); |
80 return; | 81 return; |
81 } | 82 } |
82 | 83 |
98 /* deferred accept */ | 99 /* deferred accept */ |
99 ngx_http_init_request(rev); | 100 ngx_http_init_request(rev); |
100 return; | 101 return; |
101 } | 102 } |
102 | 103 |
103 ngx_add_timer(rev, c->post_accept_timeout); | 104 ngx_add_timer(rev, c->listening->post_accept_timeout); |
104 rev->timer_set = 1; | 105 rev->timer_set = 1; |
105 | 106 |
106 if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { | 107 if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { |
107 /* aio, iocp, epoll */ | 108 /* aio, iocp, epoll */ |
108 ngx_http_init_request(rev); | 109 ngx_http_init_request(rev); |
156 | 157 |
157 i = 0; | 158 i = 0; |
158 | 159 |
159 if (in_port->addrs.nelts > 1) { | 160 if (in_port->addrs.nelts > 1) { |
160 | 161 |
161 /* there're the several addresses on this port and one of them | 162 /* |
162 is "*:port" so getsockname() is needed to determine | 163 * there're the several addresses on this port and one of them |
163 the server address */ | 164 * is "*:port" so getsockname() is needed to determine |
164 | 165 * the server address. |
165 /* TODO: AcceptEx() already gave this sockaddr_in */ | 166 * AcceptEx() already gave this address. |
166 | 167 */ |
167 len = sizeof(struct sockaddr_in); | 168 |
168 if (getsockname(c->fd, (struct sockaddr *) &addr_in, &len) == -1) { | 169 #if (WIN32) |
169 ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_socket_errno, | 170 if (c->local_sockaddr) { |
170 "getsockname() failed"); | 171 r->in_addr = |
171 ngx_http_close_connection(c); | 172 ((struct sockaddr_in *) c->local_sockaddr)->sin_addr.s_addr; |
172 return; | 173 |
173 } | 174 } else { |
175 #endif | |
176 len = sizeof(struct sockaddr_in); | |
177 if (getsockname(c->fd, (struct sockaddr *) &addr_in, &len) == -1) { | |
178 ngx_log_error(NGX_LOG_CRIT, rev->log, ngx_socket_errno, | |
179 "getsockname() failed"); | |
180 ngx_http_close_connection(c); | |
181 return; | |
182 } | |
183 #if (WIN32) | |
184 } | |
185 #endif | |
174 | 186 |
175 r->in_addr = addr_in.sin_addr.s_addr; | 187 r->in_addr = addr_in.sin_addr.s_addr; |
176 | 188 |
177 /* the last in_port->addrs address is "*" */ | 189 /* the last in_port->addrs address is "*" */ |
178 | 190 |
687 int event; | 699 int event; |
688 ssize_t n; | 700 ssize_t n; |
689 ngx_event_t *rev; | 701 ngx_event_t *rev; |
690 ngx_http_core_srv_conf_t *cscf; | 702 ngx_http_core_srv_conf_t *cscf; |
691 | 703 |
704 rev = r->connection->read; | |
705 | |
692 n = r->header_in->last - r->header_in->pos; | 706 n = r->header_in->last - r->header_in->pos; |
693 | 707 |
694 if (n > 0) { | 708 if (n > 0) { |
709 rev->ready = 0; | |
695 return n; | 710 return n; |
696 } | 711 } |
697 | 712 |
698 n = ngx_event_recv(r->connection, r->header_in->last, | 713 n = ngx_recv(r->connection, r->header_in->last, |
699 r->header_in->end - r->header_in->last); | 714 r->header_in->end - r->header_in->last); |
700 | 715 |
701 if (n == NGX_AGAIN) { | 716 if (n == NGX_AGAIN) { |
702 rev = r->connection->read; | |
703 | |
704 if (!r->header_timeout_set) { | 717 if (!r->header_timeout_set) { |
705 if (rev->timer_set) { | 718 if (rev->timer_set) { |
706 ngx_del_timer(rev); | 719 ngx_del_timer(rev); |
707 } else { | 720 } else { |
708 rev->timer_set = 1; | 721 rev->timer_set = 1; |
771 ngx_del_timer(wev); | 784 ngx_del_timer(wev); |
772 wev->timer_set = 0; | 785 wev->timer_set = 0; |
773 } | 786 } |
774 | 787 |
775 rc = ngx_http_special_response_handler(r, rc); | 788 rc = ngx_http_special_response_handler(r, rc); |
789 | |
790 if (rc == NGX_AGAIN) { | |
791 return; | |
792 } | |
793 | |
794 if (rc == NGX_ERROR) { | |
795 ngx_http_close_request(r, 0); | |
796 ngx_http_close_connection(r->connection); | |
797 return; | |
798 } | |
799 | |
800 } else if (rc == NGX_ERROR) { | |
801 r->keepalive = 0; | |
802 r->lingering_close = 0; | |
776 } | 803 } |
777 | 804 |
778 rev = r->connection->read; | 805 rev = r->connection->read; |
779 if (rev->timer_set) { | 806 if (rev->timer_set) { |
780 ngx_del_timer(rev); | 807 ngx_del_timer(rev); |
1026 size = r->headers_in.content_length_n; | 1053 size = r->headers_in.content_length_n; |
1027 if (size > clcf->discarded_buffer_size) { | 1054 if (size > clcf->discarded_buffer_size) { |
1028 size = clcf->discarded_buffer_size; | 1055 size = clcf->discarded_buffer_size; |
1029 } | 1056 } |
1030 | 1057 |
1031 n = ngx_event_recv(r->connection, r->discarded_buffer, size); | 1058 n = ngx_recv(r->connection, r->discarded_buffer, size); |
1032 if (n == NGX_ERROR) { | 1059 if (n == NGX_ERROR) { |
1033 return NGX_HTTP_BAD_REQUEST; | 1060 return NGX_HTTP_BAD_REQUEST; |
1034 } | 1061 } |
1035 | 1062 |
1036 if (n == NGX_AGAIN) { | 1063 if (n == NGX_AGAIN) { |
1167 /* MSIE closes a keepalive connection with RST flag | 1194 /* MSIE closes a keepalive connection with RST flag |
1168 so we ignore ECONNRESET here */ | 1195 so we ignore ECONNRESET here */ |
1169 | 1196 |
1170 rev->ignore_econnreset = 1; | 1197 rev->ignore_econnreset = 1; |
1171 ngx_set_socket_errno(0); | 1198 ngx_set_socket_errno(0); |
1172 n = ngx_event_recv(c, c->buffer->last, c->buffer->end - c->buffer->last); | 1199 n = ngx_recv(c, c->buffer->last, c->buffer->end - c->buffer->last); |
1173 rev->ignore_econnreset = 0; | 1200 rev->ignore_econnreset = 0; |
1174 | 1201 |
1175 if (n == NGX_AGAIN) { | 1202 if (n == NGX_AGAIN) { |
1176 return; | 1203 return; |
1177 } | 1204 } |
1305 } | 1332 } |
1306 } | 1333 } |
1307 } | 1334 } |
1308 | 1335 |
1309 do { | 1336 do { |
1310 n = ngx_event_recv(c, r->discarded_buffer, clcf->discarded_buffer_size); | 1337 n = ngx_recv(c, r->discarded_buffer, clcf->discarded_buffer_size); |
1311 | 1338 |
1312 ngx_log_debug(c->log, "lingering read: %d" _ n); | 1339 ngx_log_debug(c->log, "lingering read: %d" _ n); |
1313 | 1340 |
1314 if (n == NGX_ERROR || n == 0) { | 1341 if (n == NGX_ERROR || n == 0) { |
1315 ngx_http_close_request(r, 0); | 1342 ngx_http_close_request(r, 0); |