Skip to content

Commit 5bd304a

Browse files
committed
[dns] Use tcp for large queries, re-try with TCP if response is truncated
1 parent 781125b commit 5bd304a

2 files changed

Lines changed: 31 additions & 5 deletions

File tree

Model/HeaderBag.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public function isResponse()
4141
return 1 === $this->attributes['qr'];
4242
}
4343

44+
public function isTruncated()
45+
{
46+
return 1 === $this->attributes['tc'];
47+
}
48+
4449
public function populateCounts(Message $message)
4550
{
4651
$this->attributes['qdCount'] = count($message->questions);

Resolver.php

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Resolver
1313

1414
public function __construct($nameserver, LoopInterface $loop)
1515
{
16-
$this->nameserver = $nameserver;
16+
$this->nameserver = $this->addPortToServerIfMissing($nameserver);
1717
$this->loop = $loop;
1818
}
1919

@@ -39,16 +39,37 @@ public function query($nameserver, Query $query, $callback)
3939
$request->questions[] = (array) $query;
4040
$request->prepare();
4141

42+
$queryData = $dumper->toBinary($request);
43+
$transport = strlen($queryData) > 512 ? 'tcp' : 'udp';
44+
45+
$this->doQuery($nameserver, $transport, $queryData, $parser, $callback);
46+
}
47+
48+
public function doQuery($nameserver, $transport, $queryData, Parser $parser, $callback)
49+
{
50+
$that = $this;
51+
4252
$response = new Message();
4353

44-
$fd = stream_socket_client("udp://$nameserver:53");
54+
$fd = stream_socket_client("$transport://$nameserver");
4555
$conn = new Connection($fd, $this->loop);
46-
$conn->on('data', function ($data) use ($conn, $parser, $response, $callback) {
47-
if ($parser->parseChunk($data, $response)) {
56+
$conn->on('data', function ($data) use ($that, $conn, $parser, $response, $callback) {
57+
$responseReady = $parser->parseChunk($data, $response);
58+
if ($responseReady) {
59+
if ($response->headers->isTruncated()) {
60+
$conn->end();
61+
$that->doQuery($nameserver, 'tcp', $queryData, $parser, $callback);
62+
return;
63+
}
4864
$conn->end();
4965
$callback($response);
5066
}
5167
});
52-
$conn->write($dumper->toBinary($request));
68+
$conn->write($queryData);
69+
}
70+
71+
private function addPortToServerIfMissing($nameserver)
72+
{
73+
return false === strpos($nameserver, ':') ? "$nameserver:53" : $nameserver;
5374
}
5475
}

0 commit comments

Comments
 (0)