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;
         }