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