Mercurial > hg > nginx-vendor-current
diff 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 |
line wrap: on
line diff
--- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -99,47 +99,28 @@ ngx_resolver_create(ngx_peer_addr_t *add return NULL; } - uc = ngx_calloc(sizeof(ngx_udp_connection_t), log); - if (uc == NULL) { - return NULL; - } - r->event = ngx_calloc(sizeof(ngx_event_t), log); if (r->event == NULL) { return NULL; } - ngx_rbtree_sentinel_init(&r->name_sentinel); - - r->name_rbtree.root = &r->name_sentinel; - r->name_rbtree.sentinel = &r->name_sentinel; - r->name_rbtree.insert = ngx_resolver_rbtree_insert_value; - - ngx_rbtree_sentinel_init(&r->addr_sentinel); - - r->addr_rbtree.root = &r->addr_sentinel; - r->addr_rbtree.sentinel = &r->addr_sentinel; - r->addr_rbtree.insert = ngx_rbtree_insert_value; - - r->name_resend_queue.prev = &r->name_resend_queue; - r->name_resend_queue.next = &r->name_resend_queue; - - r->addr_resend_queue.prev = &r->addr_resend_queue; - r->addr_resend_queue.next = &r->addr_resend_queue; - - r->name_expire_queue.prev = &r->name_expire_queue; - r->name_expire_queue.next = &r->name_expire_queue; - - r->addr_expire_queue.prev = &r->addr_expire_queue; - r->addr_expire_queue.next = &r->addr_expire_queue; + ngx_rbtree_init(&r->name_rbtree, &r->name_sentinel, + ngx_resolver_rbtree_insert_value); + + ngx_rbtree_init(&r->addr_rbtree, &r->addr_sentinel, + ngx_rbtree_insert_value); + + ngx_queue_init(&r->name_resend_queue); + ngx_queue_init(&r->addr_resend_queue); + + ngx_queue_init(&r->name_expire_queue); + ngx_queue_init(&r->addr_expire_queue); r->event->handler = ngx_resolver_resend_handler; r->event->data = r; r->event->log = log; r->ident = -1; - r->udp_connection = uc; - r->resend_timeout = 5; r->expire = 30; r->valid = 300; @@ -147,10 +128,19 @@ ngx_resolver_create(ngx_peer_addr_t *add r->log = log; r->log_level = NGX_LOG_ALERT; - uc->sockaddr = addr->sockaddr; - uc->socklen = addr->socklen; - uc->server = addr->name; - uc->log = log; + if (addr) { + uc = ngx_calloc(sizeof(ngx_udp_connection_t), log); + if (uc == NULL) { + return NULL; + } + + r->udp_connection = uc; + + uc->sockaddr = addr->sockaddr; + uc->socklen = addr->socklen; + uc->server = addr->name; + uc->log = log; + } return r; } @@ -177,6 +167,10 @@ ngx_resolve_start(ngx_resolver_t *r, ngx } } + if (r->udp_connection == NULL) { + return NGX_NO_RESOLVER; + } + ctx = ngx_resolver_calloc(r, sizeof(ngx_resolver_ctx_t)); if (ctx) { @@ -748,7 +742,7 @@ ngx_resolver_resend_handler(ngx_event_t /* lock addr mutex */ atimer = ngx_resolver_resend(r, &r->addr_rbtree, &r->addr_resend_queue); - + /* unlock addr mutex */ if (ntimer == 0) { @@ -832,9 +826,9 @@ ngx_resolver_read_response(ngx_event_t * c = rev->data; do { - n = ngx_recv(c, buf, NGX_RESOLVER_UDP_SIZE); - - if (n == -1) { + n = ngx_udp_recv(c, buf, NGX_RESOLVER_UDP_SIZE); + + if (n < 0) { return; }