Mercurial > hg > nginx-vendor-current
diff src/core/ngx_resolver.c @ 416:b4f69f2ef02c NGINX_0_7_20
nginx 0.7.20
*) Changes in the ngx_http_gzip_filter_module.
*) Feature: the ngx_http_limit_req_module.
*) Bugfix: worker processes might exit on a SIGBUS signal on sparc and
ppc platforms; the bug had appeared in 0.7.3.
Thanks to Maxim Dounin.
*) Bugfix: the "proxy_pass http://host/some:uri" directives did not
work; the bug had appeared in 0.7.12.
*) Bugfix: in HTTPS mode requests might fail with the "bad write retry"
error.
*) Bugfix: the ngx_http_secure_link_module did not work inside
locations, whose names are less than 3 characters.
*) Bugfix: $server_addr variable might have no value.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Mon, 10 Nov 2008 00:00:00 +0300 |
parents | edf1cb6c328e |
children | ad0a34a8efa6 |
line wrap: on
line diff
--- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -956,11 +956,14 @@ ngx_resolver_process_response(ngx_resolv { char *err; size_t len; - ngx_uint_t i, ident, flags, code, nqs, nan, qtype, qclass; + ngx_uint_t i, times, ident, qident, flags, code, nqs, nan, + qtype, qclass; + ngx_queue_t *q; ngx_resolver_qs_t *qs; + ngx_resolver_node_t *rn; ngx_resolver_query_t *query; - if ((size_t) n < sizeof(ngx_resolver_query_t) + 1) { + if ((size_t) n < sizeof(ngx_resolver_query_t)) { goto short_response; } @@ -985,11 +988,31 @@ ngx_resolver_process_response(ngx_resolv code = flags & 0x7f; - if (code == NGX_RESOLVE_FORMERR || code > NGX_RESOLVE_REFUSED) { - ngx_log_error(r->log_level, r->log, 0, - "DNS error (%ui: %s), query id:%ui", - code, ngx_resolver_strerror(code), ident); - return; + if (code == NGX_RESOLVE_FORMERR) { + + times = 0; + + for (q = ngx_queue_head(&r->name_resend_queue); + q != ngx_queue_sentinel(&r->name_resend_queue) || times++ < 100; + q = ngx_queue_next(q)) + { + rn = ngx_queue_data(q, ngx_resolver_node_t, queue); + qident = (rn->query[0] << 8) + rn->query[1]; + + if (qident == ident) { + ngx_log_error(r->log_level, r->log, 0, + "DNS error (%ui: %s), query id:%ui, name:\"%*s\"", + code, ngx_resolver_strerror(code), ident, + rn->nlen, rn->name); + return; + } + } + + goto dns_error; + } + + if (code > NGX_RESOLVE_REFUSED) { + goto dns_error; } if (nqs != 1) { @@ -1069,6 +1092,13 @@ done: ngx_log_error(r->log_level, r->log, 0, err); return; + +dns_error: + + ngx_log_error(r->log_level, r->log, 0, + "DNS error (%ui: %s), query id:%ui", + code, ngx_resolver_strerror(code), ident); + return; }