Skip to content

Commit 3bf372f

Browse files
committed
Support promise cancellation for CachingExecutor
1 parent d1125da commit 3bf372f

2 files changed

Lines changed: 23 additions & 18 deletions

File tree

src/Query/CachingExecutor.php

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use React\Cache\CacheInterface;
66
use React\Dns\Model\Message;
7+
use React\Promise\Promise;
78

89
class CachingExecutor implements ExecutorInterface
910
{
@@ -30,21 +31,29 @@ public function query($nameserver, Query $query)
3031
$cache = $this->cache;
3132
$executor = $this->executor;
3233

33-
return $cache->get($id)->then(function ($message) use ($nameserver, $query, $id, $cache, $executor) {
34-
// return cached response message on cache hit
35-
if ($message !== null) {
36-
return $message;
37-
}
38-
39-
// perform DNS lookup if not already cached
40-
return $executor->query($nameserver, $query)->then(
41-
function (Message $message) use ($cache, $id) {
42-
// DNS response message received => store in cache and return
43-
$cache->set($id, $message, CachingExecutor::TTL);
44-
45-
return $message;
34+
$pending = $cache->get($id);
35+
return new Promise(function ($resolve, $reject) use ($nameserver, $query, $id, $cache, $executor, &$pending) {
36+
$pending->then(
37+
function ($message) use ($nameserver, $query, $id, $cache, $executor, &$pending) {
38+
// return cached response message on cache hit
39+
if ($message !== null) {
40+
return $message;
41+
}
42+
43+
// perform DNS lookup if not already cached
44+
return $pending = $executor->query($nameserver, $query)->then(
45+
function (Message $message) use ($cache, $id) {
46+
// DNS response message received => store in cache and return
47+
$cache->set($id, $message, CachingExecutor::TTL);
48+
49+
return $message;
50+
}
51+
);
4652
}
47-
);
53+
)->then($resolve, $reject);
54+
}, function ($_, $reject) use (&$pending, $query) {
55+
$reject(new \RuntimeException('DNS query for ' . $query->name . ' has been cancelled'));
56+
$pending->cancel();
4857
});
4958
}
5059
}

tests/Query/CachingExecutorTest.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ public function testQueryWillReturnRejectedPromiseWhenCacheReturnsMissAndFallbac
101101

102102
public function testCancelQueryWillReturnRejectedPromiseAndCancelPendingPromiseFromCache()
103103
{
104-
$this->markTestIncomplete();
105-
106104
$fallback = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock();
107105
$fallback->expects($this->never())->method('query');
108106

@@ -122,8 +120,6 @@ public function testCancelQueryWillReturnRejectedPromiseAndCancelPendingPromiseF
122120

123121
public function testCancelQueryWillReturnRejectedPromiseAndCancelPendingPromiseFromFallbackExecutorWhenCacheReturnsMiss()
124122
{
125-
$this->markTestIncomplete();
126-
127123
$pending = new Promise(function () { }, $this->expectCallableOnce());
128124
$fallback = $this->getMockBuilder('React\Dns\Query\ExecutorInterface')->getMock();
129125
$fallback->expects($this->once())->method('query')->willReturn($pending);

0 commit comments

Comments
 (0)