@@ -4,6 +4,7 @@ local open = io.open
4
4
local gmatch = string.gmatch
5
5
local match = string.match
6
6
local format = string.format
7
+ local find = string.find
7
8
local rep = string.rep
8
9
local unpack = unpack
9
10
local insert = table.insert
@@ -197,6 +198,10 @@ local function is_ip(address)
197
198
end
198
199
end
199
200
201
+ local function is_fqdn (name )
202
+ return find (name , ' .' , 1 , true )
203
+ end
204
+
200
205
local servers_mt = {
201
206
__tostring = function (t )
202
207
return format (rep (' %s' , # t , ' ' ), unpack (t ))
217
222
218
223
local empty = {}
219
224
220
- local function lookup (dns , qname , search , options )
225
+ local function valid_answers (answers )
226
+ return answers and not answers .errcode and # answers > 0 and (not answers .addresses or # answers .addresses > 0 )
227
+ end
228
+
229
+ local function search_dns (self , qname , stale )
230
+ local search = self .search
231
+ local dns = self .dns
232
+ local options = self .options
233
+ local cache = self .cache
234
+
235
+ local answers , err
236
+
237
+ for i = 1 , # search do
238
+ local query = qname .. ' .' .. search [i ]
239
+ ngx .log (ngx .DEBUG , ' resolver query: ' , qname , ' search: ' , search [i ], ' query: ' , query )
240
+
241
+ answers , err = cache :get (query , stale )
242
+ if valid_answers (answers ) then break end
243
+
244
+ answers , err = dns :query (query , options )
245
+ if valid_answers (answers ) then
246
+ cache :save (answers )
247
+ break
248
+ end
249
+ end
250
+
251
+ return answers , err
252
+ end
253
+
254
+ function _M .lookup (self , qname , stale )
255
+ local cache = self .cache
256
+
221
257
ngx .log (ngx .DEBUG , ' resolver query: ' , qname )
222
258
223
259
local answers , err
@@ -226,18 +262,18 @@ local function lookup(dns, qname, search, options)
226
262
ngx .log (ngx .DEBUG , ' host is ip address: ' , qname )
227
263
answers = { new_answer (qname ) }
228
264
else
229
- for i = 1 , # search do
230
- local query = qname .. ' .' .. search [i ]
231
- ngx .log (ngx .DEBUG , ' resolver query: ' , qname , ' search: ' , search [i ], ' query: ' , query )
232
- answers , err = dns :query (query , options )
233
-
234
- if answers and not answers .errcode and # answers > 0 then
235
- break
236
- end
265
+ if is_fqdn (qname ) then
266
+ answers , err = cache :get (qname , stale )
267
+ end
268
+
269
+ if not valid_answers (answers ) then
270
+ answers , err = search_dns (self , qname , stale )
237
271
end
272
+
238
273
end
239
274
240
275
ngx .log (ngx .DEBUG , ' resolver query: ' , qname , ' finished with ' , # (answers or empty ), ' answers' )
276
+
241
277
return answers , err
242
278
end
243
279
@@ -253,20 +289,12 @@ function _M.get_servers(self, qname, opts)
253
289
return nil , ' query missing'
254
290
end
255
291
256
- local cache = self .cache
257
- local search = self .search or _M .search
258
-
259
292
-- TODO: pass proper options to dns resolver (like SRV query type)
260
293
261
294
local sema , key = synchronization :acquire (format (' qname:%s:qtype:%s' , qname , ' A' ))
262
295
local ok = sema :wait (0 )
263
296
264
- local answers , err = cache :get (qname , not ok )
265
-
266
- if not answers or err or # answers .addresses == 0 then
267
- answers , err = lookup (dns , qname , search , self .options )
268
- cache :save (answers )
269
- end
297
+ local answers , err = self :lookup (qname , not ok )
270
298
271
299
if ok then
272
300
-- cleanup the key so we don't have unbounded growth of this table
0 commit comments