Mercurial > hg > nginx-vendor-current
comparison src/core/ngx_resolver.c @ 650:4d05413aebad NGINX_1_1_9
nginx 1.1.9
*) Change: now double quotes are encoded in an "echo" SSI-command
output.
Thanks to Zaur Abasmirzoev.
*) Feature: the "valid" parameter of the "resolver" directive. By
default TTL returned by a DNS server is used.
Thanks to Kirill A. Korinskiy.
*) Bugfix: nginx might hang after a worker process abnormal termination.
*) Bugfix: a segmentation fault might occur in a worker process if SNI
was used; the bug had appeared in 1.1.2.
*) Bugfix: in the "keepalive_disable" directive; the bug had appeared in
1.1.8.
Thanks to Alexander Usov.
*) Bugfix: SIGWINCH signal did not work after first binary upgrade; the
bug had appeared in 1.1.1.
*) Bugfix: backend responses with length not matching "Content-Length"
header line are no longer cached.
*) Bugfix: in the "scgi_param" directive, if complex parameters were
used.
*) Bugfix: in the "epoll" event method.
Thanks to Yichun Zhang.
*) Bugfix: in the ngx_http_flv_module.
Thanks to Piotr Sikora.
*) Bugfix: in the ngx_http_mp4_module.
*) Bugfix: IPv6 addresses are now handled properly in a request line and
in a "Host" request header line.
*) Bugfix: "add_header" and "expires" directives did not work if a
request was proxied and response status code was 206.
*) Bugfix: nginx could not be built on FreeBSD 10.
*) Bugfix: nginx could not be built on AIX.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 28 Nov 2011 00:00:00 +0400 |
parents | f200748c0ac8 |
children | d0f7a625f27c |
comparison
equal
deleted
inserted
replaced
649:c5b99ec117cd | 650:4d05413aebad |
---|---|
91 | 91 |
92 | 92 |
93 ngx_resolver_t * | 93 ngx_resolver_t * |
94 ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) | 94 ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n) |
95 { | 95 { |
96 ngx_str_t s; | |
96 ngx_url_t u; | 97 ngx_url_t u; |
97 ngx_uint_t i; | 98 ngx_uint_t i; |
98 ngx_resolver_t *r; | 99 ngx_resolver_t *r; |
99 ngx_pool_cleanup_t *cln; | 100 ngx_pool_cleanup_t *cln; |
100 ngx_udp_connection_t *uc; | 101 ngx_udp_connection_t *uc; |
144 r->event->log = &cf->cycle->new_log; | 145 r->event->log = &cf->cycle->new_log; |
145 r->ident = -1; | 146 r->ident = -1; |
146 | 147 |
147 r->resend_timeout = 5; | 148 r->resend_timeout = 5; |
148 r->expire = 30; | 149 r->expire = 30; |
149 r->valid = 300; | 150 r->valid = 0; |
150 | 151 |
151 r->log = &cf->cycle->new_log; | 152 r->log = &cf->cycle->new_log; |
152 r->log_level = NGX_LOG_ERR; | 153 r->log_level = NGX_LOG_ERR; |
153 | 154 |
154 for (i = 0; i < n; i++) { | 155 for (i = 0; i < n; i++) { |
156 if (ngx_strncmp(names[i].data, "valid=", 6) == 0) { | |
157 s.len = names[i].len - 6; | |
158 s.data = names[i].data + 6; | |
159 | |
160 r->valid = ngx_parse_time(&s, 1); | |
161 | |
162 if (r->valid == NGX_ERROR) { | |
163 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
164 "invalid parameter: %V", &names[i]); | |
165 return NULL; | |
166 } | |
167 | |
168 continue; | |
169 } | |
170 | |
155 ngx_memzero(&u, sizeof(ngx_url_t)); | 171 ngx_memzero(&u, sizeof(ngx_url_t)); |
156 | 172 |
157 u.host = names[i]; | 173 u.host = names[i]; |
158 u.port = 53; | 174 u.port = 53; |
159 | 175 |
1147 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans) | 1163 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans) |
1148 { | 1164 { |
1149 char *err; | 1165 char *err; |
1150 u_char *cname; | 1166 u_char *cname; |
1151 size_t len; | 1167 size_t len; |
1168 int32_t ttl; | |
1152 uint32_t hash; | 1169 uint32_t hash; |
1153 in_addr_t addr, *addrs; | 1170 in_addr_t addr, *addrs; |
1154 ngx_str_t name; | 1171 ngx_str_t name; |
1155 ngx_uint_t qtype, qident, naddrs, a, i, n, start; | 1172 ngx_uint_t qtype, qident, naddrs, a, i, n, start; |
1156 ngx_resolver_an_t *an; | 1173 ngx_resolver_an_t *an; |
1217 naddrs = 0; | 1234 naddrs = 0; |
1218 addr = 0; | 1235 addr = 0; |
1219 addrs = NULL; | 1236 addrs = NULL; |
1220 cname = NULL; | 1237 cname = NULL; |
1221 qtype = 0; | 1238 qtype = 0; |
1239 ttl = 0; | |
1222 | 1240 |
1223 for (a = 0; a < nan; a++) { | 1241 for (a = 0; a < nan; a++) { |
1224 | 1242 |
1225 start = i; | 1243 start = i; |
1226 | 1244 |
1256 | 1274 |
1257 an = (ngx_resolver_an_t *) &buf[i]; | 1275 an = (ngx_resolver_an_t *) &buf[i]; |
1258 | 1276 |
1259 qtype = (an->type_hi << 8) + an->type_lo; | 1277 qtype = (an->type_hi << 8) + an->type_lo; |
1260 len = (an->len_hi << 8) + an->len_lo; | 1278 len = (an->len_hi << 8) + an->len_lo; |
1279 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) | |
1280 + (an->ttl[2] << 8) + (an->ttl[3]); | |
1281 | |
1282 if (ttl < 0) { | |
1283 ttl = 0; | |
1284 } | |
1261 | 1285 |
1262 if (qtype == NGX_RESOLVE_A) { | 1286 if (qtype == NGX_RESOLVE_A) { |
1263 | 1287 |
1264 i += sizeof(ngx_resolver_an_t); | 1288 i += sizeof(ngx_resolver_an_t); |
1265 | 1289 |
1285 ngx_log_error(r->log_level, r->log, 0, | 1309 ngx_log_error(r->log_level, r->log, 0, |
1286 "unexpected qtype %ui", qtype); | 1310 "unexpected qtype %ui", qtype); |
1287 } | 1311 } |
1288 } | 1312 } |
1289 | 1313 |
1290 ngx_log_debug2(NGX_LOG_DEBUG_CORE, r->log, 0, | 1314 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, |
1291 "resolver naddrs:%ui cname:%p", naddrs, cname); | 1315 "resolver naddrs:%ui cname:%p ttl:%d", |
1316 naddrs, cname, ttl); | |
1292 | 1317 |
1293 if (naddrs) { | 1318 if (naddrs) { |
1294 | 1319 |
1295 if (naddrs == 1) { | 1320 if (naddrs == 1) { |
1296 rn->u.addr = addr; | 1321 rn->u.addr = addr; |
1355 | 1380 |
1356 rn->naddrs = (u_short) naddrs; | 1381 rn->naddrs = (u_short) naddrs; |
1357 | 1382 |
1358 ngx_queue_remove(&rn->queue); | 1383 ngx_queue_remove(&rn->queue); |
1359 | 1384 |
1360 rn->valid = ngx_time() + r->valid; | 1385 rn->valid = ngx_time() + (r->valid ? r->valid : ttl); |
1361 rn->expire = ngx_time() + r->expire; | 1386 rn->expire = ngx_time() + r->expire; |
1362 | 1387 |
1363 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); | 1388 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); |
1364 | 1389 |
1365 next = rn->waiting; | 1390 next = rn->waiting; |
1397 | 1422 |
1398 ngx_queue_remove(&rn->queue); | 1423 ngx_queue_remove(&rn->queue); |
1399 | 1424 |
1400 rn->cnlen = (u_short) name.len; | 1425 rn->cnlen = (u_short) name.len; |
1401 rn->u.cname = name.data; | 1426 rn->u.cname = name.data; |
1402 rn->valid = ngx_time() + r->valid; | 1427 |
1428 rn->valid = ngx_time() + (r->valid ? r->valid : ttl); | |
1403 rn->expire = ngx_time() + r->expire; | 1429 rn->expire = ngx_time() + r->expire; |
1404 | 1430 |
1405 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); | 1431 ngx_queue_insert_head(&r->name_expire_queue, &rn->queue); |
1406 | 1432 |
1407 ctx = rn->waiting; | 1433 ctx = rn->waiting; |
1448 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) | 1474 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) |
1449 { | 1475 { |
1450 char *err; | 1476 char *err; |
1451 size_t len; | 1477 size_t len; |
1452 in_addr_t addr; | 1478 in_addr_t addr; |
1479 int32_t ttl; | |
1453 ngx_int_t digit; | 1480 ngx_int_t digit; |
1454 ngx_str_t name; | 1481 ngx_str_t name; |
1455 ngx_uint_t i, mask, qident; | 1482 ngx_uint_t i, mask, qident; |
1456 ngx_resolver_an_t *an; | 1483 ngx_resolver_an_t *an; |
1457 ngx_resolver_ctx_t *ctx, *next; | 1484 ngx_resolver_ctx_t *ctx, *next; |
1543 } | 1570 } |
1544 | 1571 |
1545 an = (ngx_resolver_an_t *) &buf[i + 2]; | 1572 an = (ngx_resolver_an_t *) &buf[i + 2]; |
1546 | 1573 |
1547 len = (an->len_hi << 8) + an->len_lo; | 1574 len = (an->len_hi << 8) + an->len_lo; |
1575 ttl = (an->ttl[0] << 24) + (an->ttl[1] << 16) | |
1576 + (an->ttl[2] << 8) + (an->ttl[3]); | |
1577 | |
1578 if (ttl < 0) { | |
1579 ttl = 0; | |
1580 } | |
1548 | 1581 |
1549 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, | 1582 ngx_log_debug3(NGX_LOG_DEBUG_CORE, r->log, 0, |
1550 "resolver qt:%ui cl:%ui len:%uz", | 1583 "resolver qt:%ui cl:%ui len:%uz", |
1551 (an->type_hi << 8) + an->type_lo, | 1584 (an->type_hi << 8) + an->type_lo, |
1552 (an->class_hi << 8) + an->class_lo, len); | 1585 (an->class_hi << 8) + an->class_lo, len); |
1579 } | 1612 } |
1580 } | 1613 } |
1581 | 1614 |
1582 ngx_queue_remove(&rn->queue); | 1615 ngx_queue_remove(&rn->queue); |
1583 | 1616 |
1584 rn->valid = ngx_time() + r->valid; | 1617 rn->valid = ngx_time() + (r->valid ? r->valid : ttl); |
1585 rn->expire = ngx_time() + r->expire; | 1618 rn->expire = ngx_time() + r->expire; |
1586 | 1619 |
1587 ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); | 1620 ngx_queue_insert_head(&r->addr_expire_queue, &rn->queue); |
1588 | 1621 |
1589 next = rn->waiting; | 1622 next = rn->waiting; |