@@ -15,22 +15,24 @@ class Executor implements ExecutorInterface
1515 private $ loop ;
1616 private $ parser ;
1717 private $ dumper ;
18+ private $ timeout ;
1819
19- public function __construct (LoopInterface $ loop , Parser $ parser , BinaryDumper $ dumper )
20+ public function __construct (LoopInterface $ loop , Parser $ parser , BinaryDumper $ dumper, $ timeout = 5 )
2021 {
2122 $ this ->loop = $ loop ;
2223 $ this ->parser = $ parser ;
2324 $ this ->dumper = $ dumper ;
25+ $ this ->timeout = $ timeout ;
2426 }
2527
26- public function query ($ nameserver , Query $ query , $ callback )
28+ public function query ($ nameserver , Query $ query , $ callback, $ errorback )
2729 {
2830 $ request = $ this ->prepareRequest ($ query );
2931
3032 $ queryData = $ this ->dumper ->toBinary ($ request );
3133 $ transport = strlen ($ queryData ) > 512 ? 'tcp ' : 'udp ' ;
3234
33- $ this ->doQuery ($ nameserver , $ transport , $ queryData , $ callback );
35+ $ this ->doQuery ($ nameserver , $ transport , $ queryData , $ callback, $ errorback );
3436 }
3537
3638 public function prepareRequest (Query $ query )
@@ -44,25 +46,33 @@ public function prepareRequest(Query $query)
4446 return $ request ;
4547 }
4648
47- public function doQuery ($ nameserver , $ transport , $ queryData , $ callback )
49+ public function doQuery ($ nameserver , $ transport , $ queryData , $ callback, $ errorback )
4850 {
4951 $ that = $ this ;
5052 $ parser = $ this ->parser ;
53+ $ loop = $ this ->loop ;
5154
5255 $ response = new Message ();
5356
54- $ retryWithTcp = function () use ($ that , $ nameserver , $ queryData , $ callback ) {
55- $ that ->doQuery ($ nameserver , 'tcp ' , $ queryData , $ callback );
57+ $ retryWithTcp = function () use ($ that , $ nameserver , $ queryData , $ callback, $ errorback ) {
58+ $ that ->doQuery ($ nameserver , 'tcp ' , $ queryData , $ callback, $ errorback );
5659 };
5760
61+ $ timer = $ this ->loop ->addTimer ($ this ->timeout , function () use (&$ conn , $ errorback ) {
62+ $ conn ->close ();
63+ $ errorback (new TimeoutException ("query timed out " ));
64+ });
65+
5866 $ conn = $ this ->createConnection ($ nameserver , $ transport );
59- $ conn ->on ('data ' , function ($ data ) use ($ that , $ retryWithTcp , $ conn , $ parser , $ response , $ transport , $ callback ) {
67+ $ conn ->on ('data ' , function ($ data ) use ($ that , $ retryWithTcp , $ conn , $ parser , $ response , $ transport , $ callback, $ loop , $ timer ) {
6068 $ responseReady = $ parser ->parseChunk ($ data , $ response );
6169
6270 if (!$ responseReady ) {
6371 return ;
6472 }
6573
74+ $ loop ->cancelTimer ($ timer );
75+
6676 if ($ response ->header ->isTruncated ()) {
6777 if ('tcp ' === $ transport ) {
6878 throw new BadServerException ('The server set the truncated bit although we issued a TCP request ' );
0 commit comments