pending-dns 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api-server.js +2 -2
- package/lib/dns-handler.js +7 -4
- package/lib/dns-server.js +10 -2
- package/lib/dns-tcp-server.js +9 -3
- package/lib/dns-udp-server.js +6 -3
- package/lib/public-server.js +21 -2
- package/package.json +1 -1
package/lib/api-server.js
CHANGED
|
@@ -125,7 +125,7 @@ const recordScheme = Joi.object({
|
|
|
125
125
|
allowQuerySquareBrackets: false
|
|
126
126
|
})
|
|
127
127
|
.default(false)
|
|
128
|
-
.
|
|
128
|
+
.optional()
|
|
129
129
|
})
|
|
130
130
|
.when('type', {
|
|
131
131
|
is: 'AAAA',
|
|
@@ -138,7 +138,7 @@ const recordScheme = Joi.object({
|
|
|
138
138
|
allowQuerySquareBrackets: false
|
|
139
139
|
})
|
|
140
140
|
.default(false)
|
|
141
|
-
.
|
|
141
|
+
.optional()
|
|
142
142
|
})
|
|
143
143
|
.description('Health check URI for A/AAAA')
|
|
144
144
|
.label('HealthCheck'),
|
package/lib/dns-handler.js
CHANGED
|
@@ -62,6 +62,7 @@ const processQuestion = async (response, question, domain, depth) => {
|
|
|
62
62
|
domain = normalizeDomain(domain || question.name);
|
|
63
63
|
|
|
64
64
|
let questionTypeStr = reversedTypes.has(question.type) ? reversedTypes.get(question.type) : false;
|
|
65
|
+
|
|
65
66
|
if (!questionTypeStr) {
|
|
66
67
|
// nothing to do here
|
|
67
68
|
return;
|
|
@@ -341,10 +342,11 @@ const dnsHandler = async request => {
|
|
|
341
342
|
|
|
342
343
|
await Promise.all(
|
|
343
344
|
request.questions.map(question => {
|
|
344
|
-
logger.
|
|
345
|
+
logger.debug({
|
|
345
346
|
id: request._id,
|
|
346
347
|
msg: 'DNS query',
|
|
347
|
-
|
|
348
|
+
action: 'dns_query',
|
|
349
|
+
proto: request.source.type,
|
|
348
350
|
port: request.source.port,
|
|
349
351
|
address: request.source.address,
|
|
350
352
|
question: question.name,
|
|
@@ -354,9 +356,10 @@ const dnsHandler = async request => {
|
|
|
354
356
|
})
|
|
355
357
|
);
|
|
356
358
|
|
|
357
|
-
logger.
|
|
358
|
-
msg: 'DNS response',
|
|
359
|
+
logger.debug({
|
|
359
360
|
id: request._id,
|
|
361
|
+
msg: 'DNS response',
|
|
362
|
+
action: 'dns_response',
|
|
360
363
|
dnsTime: Date.now() - startTime,
|
|
361
364
|
questions: request.questions,
|
|
362
365
|
answers: response.answers
|
package/lib/dns-server.js
CHANGED
|
@@ -7,10 +7,14 @@ const logger = require('./logger').child({ component: 'dns-server' });
|
|
|
7
7
|
const { createDNSTcpServer } = require('./dns-tcp-server');
|
|
8
8
|
const { createDNSUdpServer } = require('./dns-udp-server');
|
|
9
9
|
|
|
10
|
+
const SUSPENDED_TYPES = new Set([
|
|
11
|
+
0x29 // EDNS is supported by the dns module
|
|
12
|
+
]);
|
|
13
|
+
|
|
10
14
|
const SUPPORTED_TYPES = new Set(
|
|
11
15
|
Object.keys(dns2.Packet.TYPE)
|
|
12
16
|
.map(key => dns2.Packet.TYPE[key])
|
|
13
|
-
.filter(val => typeof val === 'number')
|
|
17
|
+
.filter(val => typeof val === 'number' && !SUSPENDED_TYPES.has(val))
|
|
14
18
|
);
|
|
15
19
|
|
|
16
20
|
const init = async () => {
|
|
@@ -59,7 +63,11 @@ const init = async () => {
|
|
|
59
63
|
logger.info({ msg: 'DNS server listening', protocol: 'tcp', host: config.dns.host, port: config.dns.port });
|
|
60
64
|
})
|
|
61
65
|
.on('error', err => {
|
|
62
|
-
|
|
66
|
+
let method = 'error';
|
|
67
|
+
if (err && ['ECONNRESET'].includes(err.code)) {
|
|
68
|
+
method = 'trace';
|
|
69
|
+
}
|
|
70
|
+
logger[method]({ msg: 'DNS server error', protocol: 'tcp', err });
|
|
63
71
|
});
|
|
64
72
|
};
|
|
65
73
|
|
package/lib/dns-tcp-server.js
CHANGED
|
@@ -40,7 +40,7 @@ class DNSTcpServer extends EventEmitter {
|
|
|
40
40
|
try {
|
|
41
41
|
request = Packet.parse(buffer.slice(2));
|
|
42
42
|
} catch (err) {
|
|
43
|
-
logger.
|
|
43
|
+
logger.trace({ msg: 'Failed to parse DNS package', proto: 'tcp', err, buffer, port: socket.remotePort, address: socket.remoteAddress });
|
|
44
44
|
try {
|
|
45
45
|
socket.end();
|
|
46
46
|
} catch (err) {
|
|
@@ -50,7 +50,7 @@ class DNSTcpServer extends EventEmitter {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
request.source = {
|
|
53
|
-
|
|
53
|
+
proto: 'tcp',
|
|
54
54
|
port: socket.remotePort,
|
|
55
55
|
address: socket.remoteAddress
|
|
56
56
|
};
|
|
@@ -95,10 +95,16 @@ class DNSTcpServer extends EventEmitter {
|
|
|
95
95
|
try {
|
|
96
96
|
let len = Buffer.alloc(2);
|
|
97
97
|
len.writeUInt16BE(message.length);
|
|
98
|
-
|
|
98
|
+
|
|
99
|
+
if (['open', 'writeOnly'].includes(socket.readyState)) {
|
|
100
|
+
socket.end(Buffer.concat([len, message]));
|
|
101
|
+
} else {
|
|
102
|
+
socket.end();
|
|
103
|
+
}
|
|
99
104
|
} catch (err) {
|
|
100
105
|
// ignore
|
|
101
106
|
}
|
|
107
|
+
|
|
102
108
|
resolve(message);
|
|
103
109
|
});
|
|
104
110
|
}
|
package/lib/dns-udp-server.js
CHANGED
|
@@ -26,19 +26,22 @@ class DNSUdpServer extends EventEmitter {
|
|
|
26
26
|
try {
|
|
27
27
|
request = Packet.parse(buffer);
|
|
28
28
|
} catch (err) {
|
|
29
|
-
logger.
|
|
29
|
+
logger.trace({ msg: 'Failed to parse DNS package', proto: 'udp', err, buffer, port: rinfo.port, address: rinfo.address });
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
request.source = {
|
|
34
|
-
|
|
34
|
+
proto: 'udp',
|
|
35
35
|
port: rinfo.port,
|
|
36
36
|
address: rinfo.address
|
|
37
37
|
};
|
|
38
|
+
|
|
38
39
|
this.emit('request', request, this.send.bind(this, rinfo), rinfo);
|
|
39
40
|
}
|
|
40
41
|
send(rinfo, message) {
|
|
41
|
-
if (message instanceof Packet)
|
|
42
|
+
if (message instanceof Packet) {
|
|
43
|
+
message = message.toBuffer();
|
|
44
|
+
}
|
|
42
45
|
return new Promise((resolve, reject) => {
|
|
43
46
|
this.socket.send(message, rinfo.port, rinfo.address, err => {
|
|
44
47
|
if (err) return reject(err);
|
package/lib/public-server.js
CHANGED
|
@@ -263,7 +263,17 @@ const setupHttps = () =>
|
|
|
263
263
|
|
|
264
264
|
logger.error({ msg: 'Failed to serve redirect page', err, hostname });
|
|
265
265
|
|
|
266
|
-
|
|
266
|
+
let url;
|
|
267
|
+
try {
|
|
268
|
+
url = new URL(req.url || req.headers[':path'], `https://${hostname}/`);
|
|
269
|
+
} catch (err) {
|
|
270
|
+
try {
|
|
271
|
+
url = new URL(req.headers[':path'], `https://${hostname}/`);
|
|
272
|
+
} catch (err) {
|
|
273
|
+
url = `https://${hostname}/`;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
267
277
|
const route = url.pathname;
|
|
268
278
|
|
|
269
279
|
res.send(
|
|
@@ -332,8 +342,17 @@ const setupHttp = () =>
|
|
|
332
342
|
const hostname = getHostname(req).replace(/^www\./, '');
|
|
333
343
|
|
|
334
344
|
logger.error({ msg: 'Failed to serve redirect page', err, hostname });
|
|
345
|
+
let url;
|
|
346
|
+
try {
|
|
347
|
+
url = new URL(req.url || req.headers[':path'], `https://${hostname}/`);
|
|
348
|
+
} catch (err) {
|
|
349
|
+
try {
|
|
350
|
+
url = new URL(req.headers[':path'], `https://${hostname}/`);
|
|
351
|
+
} catch (err) {
|
|
352
|
+
url = `https://${hostname}/`;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
335
355
|
|
|
336
|
-
const url = new URL(req.url || req.headers[':path'], `https://${hostname}/`);
|
|
337
356
|
const route = url.pathname;
|
|
338
357
|
|
|
339
358
|
res.send(
|