Skip to content

Commit 4c8e31d

Browse files
committed
[Dns] More rafoctorings for promise usage
1 parent 26b467f commit 4c8e31d

4 files changed

Lines changed: 64 additions & 59 deletions

File tree

Config/FilesystemFactory.php

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
namespace React\Dns\Config;
44

55
use React\EventLoop\LoopInterface;
6+
use React\Promise\Deferred;
7+
use React\Promise\Util;
68
use React\Stream\Stream;
79

810
class FilesystemFactory
@@ -14,16 +16,13 @@ public function __construct(LoopInterface $loop)
1416
$this->loop = $loop;
1517
}
1618

17-
public function create($filename, $callback)
19+
public function create($filename)
1820
{
19-
$that = $this;
20-
21-
$this->loadEtcResolvConf($filename, function ($contents) use ($that, $callback) {
22-
return $that->parseEtcResolvConf($contents, $callback);
23-
});
21+
return $this->loadEtcResolvConf($filename)
22+
->then(array($this, 'parseEtcResolvConf'));
2423
}
2524

26-
public function parseEtcResolvConf($contents, $callback)
25+
public function parseEtcResolvConf($contents)
2726
{
2827
$nameservers = array();
2928

@@ -38,26 +37,37 @@ public function parseEtcResolvConf($contents, $callback)
3837
$config = new Config();
3938
$config->nameservers = $nameservers;
4039

41-
$callback($config);
40+
return Util::resolve($config);
4241
}
4342

44-
public function loadEtcResolvConf($filename, $callback)
43+
public function loadEtcResolvConf($filename)
4544
{
4645
if (!file_exists($filename)) {
47-
throw new \InvalidArgumentException("The filename for /etc/resolv.conf given does not exist: $filename");
46+
return Util::reject(new \InvalidArgumentException("The filename for /etc/resolv.conf given does not exist: $filename"));
4847
}
4948

50-
$fd = fopen($filename, 'r');
51-
stream_set_blocking($fd, 0);
49+
try {
50+
$deferred = new Deferred();
51+
52+
$fd = fopen($filename, 'r');
53+
stream_set_blocking($fd, 0);
5254

53-
$contents = '';
55+
$contents = '';
5456

55-
$stream = new Stream($fd, $this->loop);
56-
$stream->on('data', function ($data) use (&$contents) {
57-
$contents .= $data;
58-
});
59-
$stream->on('end', function () use (&$contents, $callback) {
60-
call_user_func($callback, $contents);
61-
});
57+
$stream = new Stream($fd, $this->loop);
58+
$stream->on('data', function ($data) use (&$contents) {
59+
$contents .= $data;
60+
});
61+
$stream->on('end', function () use (&$contents, $deferred) {
62+
$deferred->resolve($contents);
63+
});
64+
$stream->on('error', function ($error) use ($deferred) {
65+
$deferred->reject($error);
66+
});
67+
68+
return $deferred->promise();
69+
} catch (\Exception $e) {
70+
return Util::reject($e);
71+
}
6272
}
6373
}

Query/CachedExecutor.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use React\Dns\Model\Message;
66
use React\Dns\Model\Record;
77
use React\Promise\Deferred;
8+
use React\Promise\Util;
89

910
class CachedExecutor implements ExecutorInterface
1011
{
@@ -17,26 +18,26 @@ public function __construct(ExecutorInterface $executor, RecordCache $cache)
1718
$this->cache = $cache;
1819
}
1920

20-
public function query($nameserver, Query $query)
21+
public function query($nameserver, Query $query)
2122
{
2223
$deferred = new Deferred();
2324

2425
$cachedRecords = $this->cache->lookup($query);
26+
2527
if (count($cachedRecords)) {
2628
$cachedResponse = $this->buildResponse($query, $cachedRecords);
27-
$deferred->resolve($cachedResponse);
28-
return;
29+
30+
return Util::resolve($cachedResponse);
2931
}
3032

3133
$cache = $this->cache;
32-
$this->executor
34+
35+
return $this->executor
3336
->query($nameserver, $query)
34-
->then(function ($response) use ($cache, $query, $deferred) {
35-
$deferred->resolve($response);
37+
->then(function ($response) use ($cache, $query) {
3638
$cache->storeResponseMessage($query->currentTime, $response);
37-
}, array($deferred, 'reject'));
38-
39-
return $deferred->promise();
39+
return $response;
40+
});
4041
}
4142

4243
private function buildResponse(Query $query, array $cachedRecords)

Query/Executor.php

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use React\Dns\Protocol\BinaryDumper;
99
use React\EventLoop\LoopInterface;
1010
use React\Promise\Deferred;
11+
use React\Promise\Util;
1112
use React\Socket\Connection;
1213

1314
class Executor implements ExecutorInterface
@@ -32,10 +33,7 @@ public function query($nameserver, Query $query)
3233
$queryData = $this->dumper->toBinary($request);
3334
$transport = strlen($queryData) > 512 ? 'tcp' : 'udp';
3435

35-
$deferred = new Deferred();
36-
$this->doQuery($nameserver, $transport, $queryData, $query->name, $deferred->resolver());
37-
38-
return $deferred->promise();
36+
return $this->doQuery($nameserver, $transport, $queryData, $query->name);
3937
}
4038

4139
public function prepareRequest(Query $query)
@@ -49,27 +47,26 @@ public function prepareRequest(Query $query)
4947
return $request;
5048
}
5149

52-
public function doQuery($nameserver, $transport, $queryData, $name, $resolver)
50+
public function doQuery($nameserver, $transport, $queryData, $name)
5351
{
5452
$that = $this;
5553
$parser = $this->parser;
5654
$loop = $this->loop;
5755

5856
$response = new Message();
57+
$deferred = new Deferred();
5958

6059
$retryWithTcp = function () use ($that, $nameserver, $queryData, $name) {
61-
$that->doQuery($nameserver, 'tcp', $queryData, $name, $resolver);
60+
return $that->doQuery($nameserver, 'tcp', $queryData, $name);
6261
};
6362

64-
$timer = $this->loop->addTimer($this->timeout, function () use (&$conn, $name, $resolver) {
63+
$timer = $this->loop->addTimer($this->timeout, function () use (&$conn, $name, $deferred) {
6564
$conn->close();
66-
67-
$e = new TimeoutException(sprintf("DNS query for %s timed out", $name));
68-
$resolver->reject($e);
65+
$deferred->reject(new TimeoutException(sprintf("DNS query for %s timed out", $name)));
6966
});
7067

7168
$conn = $this->createConnection($nameserver, $transport);
72-
$conn->on('data', function ($data) use ($that, $retryWithTcp, $conn, $parser, $response, $transport, $resolver, $loop, $timer) {
69+
$conn->on('data', function ($data) use ($retryWithTcp, $conn, $parser, $response, $transport, $callback, $loop, $timer) {
7370
$responseReady = $parser->parseChunk($data, $response);
7471

7572
if (!$responseReady) {
@@ -80,18 +77,21 @@ public function doQuery($nameserver, $transport, $queryData, $name, $resolver)
8077

8178
if ($response->header->isTruncated()) {
8279
if ('tcp' === $transport) {
83-
throw new BadServerException('The server set the truncated bit although we issued a TCP request');
80+
$deferred->reject(new BadServerException('The server set the truncated bit although we issued a TCP request'));
81+
} else {
82+
$conn->end();
83+
$deferred->resolve($retryWithTcp());
8484
}
8585

86-
$conn->end();
87-
$retryWithTcp();
8886
return;
8987
}
9088

9189
$conn->end();
92-
$resolver->resolve($response);
90+
$deferred->resolve($response);
9391
});
9492
$conn->write($queryData);
93+
94+
return $deferred->promise();
9595
}
9696

9797
protected function generateId()

Query/RetryExecutor.php

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,28 @@ public function __construct(ExecutorInterface $executor, $retries = 2)
1818

1919
public function query($nameserver, Query $query)
2020
{
21-
$deferred = new Deferred();
22-
$this->tryQuery($nameserver, $query, $deferred->resolver(), $this->retries);
23-
24-
return $deferred->promise();
21+
return $this->tryQuery($nameserver, $query, $this->retries);
2522
}
2623

27-
public function tryQuery($nameserver, Query $query, $resolver, $retries)
24+
public function tryQuery($nameserver, Query $query, $retries)
2825
{
2926
$that = $this;
30-
$errorback = function ($error) use ($nameserver, $query, $resolver, $retries, $that) {
27+
$errorback = function ($error) use ($nameserver, $query, $retries, $that) {
3128
if (!$error instanceof TimeoutException) {
32-
$resolver->reject($error);
33-
return;
29+
return $error;
3430
}
3531
if (0 >= $retries) {
3632
$error = new \RuntimeException(
3733
sprintf("DNS query for %s failed: too many retries", $query->name),
3834
0,
3935
$error
4036
);
41-
$resolver->reject($error);
42-
return;
37+
return $error;
4338
}
44-
$that->tryQuery($nameserver, $query, $resolver, $retries-1);
39+
return $that->tryQuery($nameserver, $query, $retries-1);
4540
};
46-
47-
return $this->executor
48-
->query($nameserver, $query)
49-
->then(array($resolver, 'resolve'), $errorback);
41+
42+
return $this->executor->query($nameserver, $query, $errorback)
43+
->then(null, $errorback);
5044
}
5145
}

0 commit comments

Comments
 (0)