comparison 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
comparison
equal deleted inserted replaced
415:5410f1e19796 416:b4f69f2ef02c
954 static void 954 static void
955 ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n) 955 ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n)
956 { 956 {
957 char *err; 957 char *err;
958 size_t len; 958 size_t len;
959 ngx_uint_t i, ident, flags, code, nqs, nan, qtype, qclass; 959 ngx_uint_t i, times, ident, qident, flags, code, nqs, nan,
960 qtype, qclass;
961 ngx_queue_t *q;
960 ngx_resolver_qs_t *qs; 962 ngx_resolver_qs_t *qs;
963 ngx_resolver_node_t *rn;
961 ngx_resolver_query_t *query; 964 ngx_resolver_query_t *query;
962 965
963 if ((size_t) n < sizeof(ngx_resolver_query_t) + 1) { 966 if ((size_t) n < sizeof(ngx_resolver_query_t)) {
964 goto short_response; 967 goto short_response;
965 } 968 }
966 969
967 query = (ngx_resolver_query_t *) buf; 970 query = (ngx_resolver_query_t *) buf;
968 971
983 return; 986 return;
984 } 987 }
985 988
986 code = flags & 0x7f; 989 code = flags & 0x7f;
987 990
988 if (code == NGX_RESOLVE_FORMERR || code > NGX_RESOLVE_REFUSED) { 991 if (code == NGX_RESOLVE_FORMERR) {
989 ngx_log_error(r->log_level, r->log, 0, 992
990 "DNS error (%ui: %s), query id:%ui", 993 times = 0;
991 code, ngx_resolver_strerror(code), ident); 994
992 return; 995 for (q = ngx_queue_head(&r->name_resend_queue);
996 q != ngx_queue_sentinel(&r->name_resend_queue) || times++ < 100;
997 q = ngx_queue_next(q))
998 {
999 rn = ngx_queue_data(q, ngx_resolver_node_t, queue);
1000 qident = (rn->query[0] << 8) + rn->query[1];
1001
1002 if (qident == ident) {
1003 ngx_log_error(r->log_level, r->log, 0,
1004 "DNS error (%ui: %s), query id:%ui, name:\"%*s\"",
1005 code, ngx_resolver_strerror(code), ident,
1006 rn->nlen, rn->name);
1007 return;
1008 }
1009 }
1010
1011 goto dns_error;
1012 }
1013
1014 if (code > NGX_RESOLVE_REFUSED) {
1015 goto dns_error;
993 } 1016 }
994 1017
995 if (nqs != 1) { 1018 if (nqs != 1) {
996 err = "invalid number of questions in DNS response"; 1019 err = "invalid number of questions in DNS response";
997 goto done; 1020 goto done;
1066 1089
1067 done: 1090 done:
1068 1091
1069 ngx_log_error(r->log_level, r->log, 0, err); 1092 ngx_log_error(r->log_level, r->log, 0, err);
1070 1093
1094 return;
1095
1096 dns_error:
1097
1098 ngx_log_error(r->log_level, r->log, 0,
1099 "DNS error (%ui: %s), query id:%ui",
1100 code, ngx_resolver_strerror(code), ident);
1071 return; 1101 return;
1072 } 1102 }
1073 1103
1074 1104
1075 static void 1105 static void