Skip to content

Commit ded06ca

Browse files
Вася Чайкоlsongdev
authored andcommitted
Fix error: empty respose in tcp client when server response is async
1 parent 059cc68 commit ded06ca

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

client/tcp.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const makeQuery = ({ name, type = 'A', cls = Packet.CLASS.IN, clientIp, recursiv
1919
const sendQuery = (client, message) => {
2020
const len = Buffer.alloc(2);
2121
len.writeUInt16BE(message.length);
22-
client.end(Buffer.concat([ len, message ]));
22+
client.write(Buffer.concat([ len, message ]));
2323
};
2424

2525
const protocols = {
@@ -39,6 +39,7 @@ const TCPClient = ({ dns, protocol = 'tcp:', port = protocol === 'tls:' ? 853 :
3939

4040
sendQuery(client, message);
4141
const data = await Packet.readStream(client);
42+
client.end();
4243

4344
if (!data.length) throw new Error('Empty response');
4445
return Packet.parse(data);

test/index.js

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const assert = require('assert');
22
const test = require('./test');
3-
const { Packet, createDOHServer, createServer } = require('..');
4-
// const { Packet, createDOHServer, createServer, TCPClient, DOHClient, UDPClient } = require('..');
3+
// const { Packet, createDOHServer, createServer } = require('..');
4+
const { Packet, createDOHServer, createServer, TCPClient, DOHClient, UDPClient } = require('..');
55
const http = require('http');
66
const tcp = require('net');
77
const udp = require('dgram');
@@ -371,6 +371,36 @@ test('server/doh#cors - cors function', async function() {
371371
// await server.close();
372372
// });
373373

374+
test('server/udp-tcp#simple-request-async-response', async() => {
375+
const server = createServer({
376+
tcp : true,
377+
udp : true,
378+
handle(request, send, _info) {
379+
const [ question ] = request.questions;
380+
assert.deepEqual(request.questions, [ { name: 'test.com', type: 1, class: 1 } ]);
381+
const response = Packet.createResponseFromRequest(request);
382+
response.answers.push({
383+
name : question.name,
384+
type : Packet.TYPE.TXT,
385+
class : Packet.CLASS.IN,
386+
ttl : 300,
387+
data : [ 'Hello World' ],
388+
});
389+
390+
(new Promise((resolve) => setTimeout(() => resolve(), 1))).then(() => send(response));
391+
},
392+
});
393+
const servers = await server.listen();
394+
assert.ok(servers.udp.port > 1000);
395+
assert.ok(servers.tcp.port > 1000);
396+
const tcp = TCPClient({ dns: '127.0.0.1', port: servers.tcp.port });
397+
const udp = UDPClient({ dns: '127.0.0.1', port: servers.udp.port });
398+
const expected = [ { name: 'test.com', ttl: 300, type: 16, class: 1, data: 'Hello World' } ];
399+
assert.deepEqual((await tcp('test.com')).answers, expected);
400+
assert.deepEqual((await udp('test.com')).answers, expected);
401+
await server.close();
402+
});
403+
374404
test('server/all#invalid-request', async() => {
375405
const server = createServer({
376406
doh : true,

0 commit comments

Comments
 (0)