@@ -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
227
+ end
228
+
229
+ local function search_dns (search , dns , cache , qname , options , stale )
230
+ local answers , err
231
+
232
+ for i = 1 , # search do
233
+ local query = qname .. ' .' .. search [i ]
234
+ ngx .log (ngx .DEBUG , ' resolver query: ' , qname , ' search: ' , search [i ], ' query: ' , query )
235
+
236
+ answers , err = cache :get (query , stale )
237
+ if valid_answers (answers ) then break end
238
+
239
+ answers , err = dns :query (query , options )
240
+ if valid_answers (answers ) then
241
+ cache :save (answers )
242
+ break
243
+ end
244
+ end
245
+
246
+ return answers , err
247
+ end
248
+
249
+ function _M .lookup (self , qname , stale )
250
+ local search = self .search
251
+ local options = self .options
252
+ local cache = self .cache
253
+ local dns = self .dns
254
+
221
255
ngx .log (ngx .DEBUG , ' resolver query: ' , qname )
222
256
223
257
local answers , err
@@ -226,18 +260,19 @@ local function lookup(dns, qname, search, options)
226
260
ngx .log (ngx .DEBUG , ' host is ip address: ' , qname )
227
261
answers = { new_answer (qname ) }
228
262
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
263
+ if is_fqdn (qname ) then
264
+ answers , err = cache :get (qname , stale )
237
265
end
266
+
267
+ if not valid_answers (answers ) then
268
+ answers , err = search_dns (self .search , self .dns , cache , qname , self .options , stale )
269
+ end
270
+
238
271
end
239
272
240
273
ngx .log (ngx .DEBUG , ' resolver query: ' , qname , ' finished with ' , # (answers or empty ), ' answers' )
274
+
275
+
241
276
return answers , err
242
277
end
243
278
@@ -253,20 +288,12 @@ function _M.get_servers(self, qname, opts)
253
288
return nil , ' query missing'
254
289
end
255
290
256
- local cache = self .cache
257
- local search = self .search or _M .search
258
-
259
291
-- TODO: pass proper options to dns resolver (like SRV query type)
260
292
261
293
local sema , key = synchronization :acquire (format (' qname:%s:qtype:%s' , qname , ' A' ))
262
294
local ok = sema :wait (0 )
263
295
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
296
+ local answers , err = self :lookup (qname , not ok )
270
297
271
298
if ok then
272
299
-- cleanup the key so we don't have unbounded growth of this table
0 commit comments