44
55use React \Cache \CacheInterface ;
66use React \Dns \Model \Message ;
7+ use React \Promise \Promise ;
78
89class 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}
0 commit comments