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 CHANGED
@@ -125,7 +125,7 @@ const recordScheme = Joi.object({
125
125
  allowQuerySquareBrackets: false
126
126
  })
127
127
  .default(false)
128
- .required()
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
- .required()
141
+ .optional()
142
142
  })
143
143
  .description('Health check URI for A/AAAA')
144
144
  .label('HealthCheck'),
@@ -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.info({
345
+ logger.debug({
345
346
  id: request._id,
346
347
  msg: 'DNS query',
347
- type: request.source.type,
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.info({
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
- logger.error({ msg: 'DNS server error', protocol: 'tcp', err });
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
 
@@ -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.error({ msg: 'Failed to parse DNS package', type: 'tcp', err, buffer, port: socket.remotePort, address: socket.remoteAddress });
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
- type: 'tcp',
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
- socket.end(Buffer.concat([len, message]));
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
  }
@@ -26,19 +26,22 @@ class DNSUdpServer extends EventEmitter {
26
26
  try {
27
27
  request = Packet.parse(buffer);
28
28
  } catch (err) {
29
- logger.error({ msg: 'Failed to parse DNS package', type: 'udp', err, buffer, port: rinfo.port, address: rinfo.address });
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
- type: 'udp',
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) message = message.toBuffer();
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);
@@ -263,7 +263,17 @@ const setupHttps = () =>
263
263
 
264
264
  logger.error({ msg: 'Failed to serve redirect page', err, hostname });
265
265
 
266
- const url = new URL(req.url || req.headers[':path'], `https://${hostname}/`);
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(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pending-dns",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "Lightweight API driven DNS server",
5
5
  "main": "index.js",
6
6
  "scripts": {