Mercurial > hg > nginx-vendor-0-8
comparison src/core/ngx_resolver.c @ 354:583decdb82a4 NGINX_0_6_21
nginx 0.6.21
*) Change: if variable values used in a "proxy_pass" directive contain
IP-addresses only, then a "resolver" directive is not mandatory.
resolver
*) Bugfix: a segmentation fault might occur in worker process if a
"proxy_pass" directive with URI-part was used; bug appeared in
0.6.19.
*) Bugfix: if resolver was used on platform that does not support
kqueue, then nginx issued an alert "name is out of response".
Thanks to Andrei Nigmatulin.
*) Bugfix: if the $server_protocol was used in FastCGI parameters and a
request line length was near to the "client_header_buffer_size"
directive value, then nginx issued an alert "fastcgi: the request
record is too big".
*) Bugfix: if a plain text HTTP/0.9 version request was made to HTTPS
server, then nginx returned usual response.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 03 Dec 2007 00:00:00 +0300 |
parents | 5a1bb0129dff |
children | b743d290eb3b |
comparison
equal
deleted
inserted
replaced
353:4a470d9e2ea5 | 354:583decdb82a4 |
---|---|
97 r = ngx_calloc(sizeof(ngx_resolver_t), log); | 97 r = ngx_calloc(sizeof(ngx_resolver_t), log); |
98 if (r == NULL) { | 98 if (r == NULL) { |
99 return NULL; | 99 return NULL; |
100 } | 100 } |
101 | 101 |
102 uc = ngx_calloc(sizeof(ngx_udp_connection_t), log); | |
103 if (uc == NULL) { | |
104 return NULL; | |
105 } | |
106 | |
107 r->event = ngx_calloc(sizeof(ngx_event_t), log); | 102 r->event = ngx_calloc(sizeof(ngx_event_t), log); |
108 if (r->event == NULL) { | 103 if (r->event == NULL) { |
109 return NULL; | 104 return NULL; |
110 } | 105 } |
111 | 106 |
112 ngx_rbtree_sentinel_init(&r->name_sentinel); | 107 ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel, |
113 | 108 ngx_resolver_rbtree_insert_value); |
114 r->name_rbtree.root = &r->name_sentinel; | 109 |
115 r->name_rbtree.sentinel = &r->name_sentinel; | 110 ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel, |
116 r->name_rbtree.insert = ngx_resolver_rbtree_insert_value; | 111 ngx_rbtree_insert_value); |
117 | 112 |
118 ngx_rbtree_sentinel_init(&r->addr_sentinel); | 113 ngx_queue_init(&r->name_resend_queue); |
119 | 114 ngx_queue_init(&r->addr_resend_queue); |
120 r->addr_rbtree.root = &r->addr_sentinel; | 115 |
121 r->addr_rbtree.sentinel = &r->addr_sentinel; | 116 ngx_queue_init(&r->name_expire_queue); |
122 r->addr_rbtree.insert = ngx_rbtree_insert_value; | 117 ngx_queue_init(&r->addr_expire_queue); |
123 | |
124 r->name_resend_queue.prev = &r->name_resend_queue; | |
125 r->name_resend_queue.next = &r->name_resend_queue; | |
126 | |
127 r->addr_resend_queue.prev = &r->addr_resend_queue; | |
128 r->addr_resend_queue.next = &r->addr_resend_queue; | |
129 | |
130 r->name_expire_queue.prev = &r->name_expire_queue; | |
131 r->name_expire_queue.next = &r->name_expire_queue; | |
132 | |
133 r->addr_expire_queue.prev = &r->addr_expire_queue; | |
134 r->addr_expire_queue.next = &r->addr_expire_queue; | |
135 | 118 |
136 r->event->handler = ngx_resolver_resend_handler; | 119 r->event->handler = ngx_resolver_resend_handler; |
137 r->event->data = r; | 120 r->event->data = r; |
138 r->event->log = log; | 121 r->event->log = log; |
139 r->ident = -1; | 122 r->ident = -1; |
140 | 123 |
141 r->udp_connection = uc; | |
142 | |
143 r->resend_timeout = 5; | 124 r->resend_timeout = 5; |
144 r->expire = 30; | 125 r->expire = 30; |
145 r->valid = 300; | 126 r->valid = 300; |
146 | 127 |
147 r->log = log; | 128 r->log = log; |
148 r->log_level = NGX_LOG_ALERT; | 129 r->log_level = NGX_LOG_ALERT; |
149 | 130 |
150 uc->sockaddr = addr->sockaddr; | 131 if (addr) { |
151 uc->socklen = addr->socklen; | 132 uc = ngx_calloc(sizeof(ngx_udp_connection_t), log); |
152 uc->server = addr->name; | 133 if (uc == NULL) { |
153 uc->log = log; | 134 return NULL; |
135 } | |
136 | |
137 r->udp_connection = uc; | |
138 | |
139 uc->sockaddr = addr->sockaddr; | |
140 uc->socklen = addr->socklen; | |
141 uc->server = addr->name; | |
142 uc->log = log; | |
143 } | |
154 | 144 |
155 return r; | 145 return r; |
156 } | 146 } |
157 | 147 |
158 | 148 |
175 | 165 |
176 return temp; | 166 return temp; |
177 } | 167 } |
178 } | 168 } |
179 | 169 |
170 if (r->udp_connection == NULL) { | |
171 return NGX_NO_RESOLVER; | |
172 } | |
173 | |
180 ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t)); | 174 ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t)); |
181 | 175 |
182 if (ctx) { | 176 if (ctx) { |
183 ctx->resolver = r; | 177 ctx->resolver = r; |
184 } | 178 } |
746 /* unlock name mutex */ | 740 /* unlock name mutex */ |
747 | 741 |
748 /* lock addr mutex */ | 742 /* lock addr mutex */ |
749 | 743 |
750 atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue); | 744 atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue); |
751 | 745 |
752 /* unlock addr mutex */ | 746 /* unlock addr mutex */ |
753 | 747 |
754 if (ntimer == 0) { | 748 if (ntimer == 0) { |
755 timer = atimer; | 749 timer = atimer; |
756 | 750 |
830 u_char buf[NGX_RESOLVER_UDP_SIZE]; | 824 u_char buf[NGX_RESOLVER_UDP_SIZE]; |
831 | 825 |
832 c = rev->data; | 826 c = rev->data; |
833 | 827 |
834 do { | 828 do { |
835 n = ngx_recv(c, buf, NGX_RESOLVER_UDP_SIZE); | 829 n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE); |
836 | 830 |
837 if (n == -1) { | 831 if (n < 0) { |
838 return; | 832 return; |
839 } | 833 } |
840 | 834 |
841 ngx_resolver_process_response(c->data, buf, n); | 835 ngx_resolver_process_response(c->data, buf, n); |
842 | 836 |