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;