Commit 65803e83971d789c2e4141ec6b4474080082c080
Return CNAME resolutions in reponses
cel committed on 11/26/2016, 6:28:42 AMParent: bcc9d52da022e159c9c7b9d3eeeee0c08461f6dd
Files changed
lib/query.js | changed |
lib/server.js | changed |
lib/query.js | |||
---|---|---|---|
@@ -2,8 +2,25 @@ | |||
2 | 2 … | var KVSet = require("kvset"); | |
3 | 3 … | var Pad = require("pad-ipv6"); | |
4 | 4 … | var Query = module.exports = {}; | |
5 | 5 … | ||
6 … | +function isRecordEqual(a, b) { | ||
7 … | + return (a === b) || (a && b | ||
8 … | + && a.name === b.name | ||
9 … | + && a.type === b.type | ||
10 … | + && a.class === b.class); | ||
11 … | +} | ||
12 … | + | ||
13 … | +function merge(into, from) { | ||
14 … | + if (from) from.filter(function (a) { | ||
15 … | + return into.every(function (b) { | ||
16 … | + return !isRecordEqual(a, b); | ||
17 … | + }) | ||
18 … | + }).forEach(function (rec) { | ||
19 … | + into.push(rec); | ||
20 … | + }); | ||
21 … | +} | ||
22 … | + | ||
6 | 23 … | Query.branches = function (sbot, name, type, _class, cb) { | |
7 | 24 … | if (!_class) _class = "IN"; | |
8 | 25 … | var branches = []; | |
9 | 26 … | Pull(Query.all(sbot), | |
@@ -212,7 +229,30 @@ | |||
212 | 229 … | if (auth.data.ttl < ttl) ttl = auth.data.ttl; | |
213 | 230 … | } | |
214 | 231 … | }); | |
215 | 232 … | result.expires = Date.now() + ttl * 60e3; | |
233 … | + result.additionals = []; | ||
234 … | + // resolve cnames with another query | ||
235 … | + if (question.type !== 'CNAME') { | ||
236 … | + var cnames = result.answers.filter(function (answer) { | ||
237 … | + return answer.type === 'CNAME'; | ||
238 … | + }); | ||
239 … | + var waiting = cnames.length; | ||
240 … | + if (waiting > 0) { | ||
241 … | + return cnames.forEach(function (record) { | ||
242 … | + Query.query(sbot, { | ||
243 … | + class: question.class, | ||
244 … | + type: question.type, | ||
245 … | + name: record.data.replace(/\.$/, '') | ||
246 … | + }, next); | ||
247 … | + }) | ||
248 … | + function next(err, res) { | ||
249 … | + if (err) return waiting = 0, cb(err) | ||
250 … | + merge(result.additionals, res.answers); | ||
251 … | + merge(result.authorities, res.authorities); | ||
252 … | + if (!--waiting) cb(err, result); | ||
253 … | + } | ||
254 … | + } | ||
255 … | + } | ||
216 | 256 … | cb(null, result); | |
217 | 257 … | })); | |
218 | 258 … | }; |
Built with git-ssb-web