22
33namespace React \Dns \Resolver ;
44
5+ use React \Dns \Query \ExecutorInterface ;
6+ use React \Dns \Query \Query ;
57use React \Dns \BadServerException ;
68use React \Dns \RecordNotFoundException ;
79use React \Dns \Model \Message ;
1315class Resolver
1416{
1517 private $ nameserver ;
16- private $ loop ;
17- private $ parser ;
18- private $ dumper ;
18+ private $ executor ;
1919
20- public function __construct ($ nameserver , LoopInterface $ loop , Parser $ parser = null , BinaryDumper $ dumper = null )
20+ public function __construct ($ nameserver , ExecutorInterface $ executor )
2121 {
22- $ this ->nameserver = $ this ->addPortToServerIfMissing ($ nameserver );
23- $ this ->loop = $ loop ;
24- $ this ->parser = $ parser ?: new Parser ();
25- $ this ->dumper = $ dumper ?: new BinaryDumper ();
22+ $ this ->nameserver = $ nameserver ;
23+ $ this ->executor = $ executor ;
2624 }
2725
2826 public function resolve ($ domain , $ callback , $ errback = null )
@@ -31,11 +29,9 @@ public function resolve($domain, $callback, $errback = null)
3129
3230 $ query = new Query ($ domain , Message::TYPE_A , Message::CLASS_IN );
3331
34- $ this ->query ($ this ->nameserver , $ query , function (Message $ response ) use ($ that , $ callback , $ errback ) {
32+ $ this ->executor -> query ($ this ->nameserver , $ query , function (Message $ response ) use ($ that , $ callback , $ errback ) {
3533 try {
36- $ answer = $ that ->pickRandomAnswerOfType ($ response , Message::TYPE_A );
37- $ address = $ answer ->data ;
38- $ callback ($ address );
34+ $ that ->extractAddress ($ response , Message::TYPE_A , $ callback );
3935 } catch (RecordNotFoundException $ e ) {
4036 if (!$ errback ) {
4137 throw $ e ;
@@ -46,14 +42,11 @@ public function resolve($domain, $callback, $errback = null)
4642 });
4743 }
4844
49- public function query ( $ nameserver , Query $ query , $ callback )
45+ public function extractAddress ( Message $ response , $ type , $ callback )
5046 {
51- $ request = $ this ->prepareRequest ($ query );
52-
53- $ queryData = $ this ->dumper ->toBinary ($ request );
54- $ transport = strlen ($ queryData ) > 512 ? 'tcp ' : 'udp ' ;
55-
56- $ this ->doQuery ($ nameserver , $ transport , $ queryData , $ callback );
47+ $ answer = $ this ->pickRandomAnswerOfType ($ response , $ type );
48+ $ address = $ answer ->data ;
49+ $ callback ($ address );
5750 }
5851
5952 public function pickRandomAnswerOfType (Message $ response , $ type )
@@ -71,63 +64,4 @@ public function pickRandomAnswerOfType(Message $response, $type)
7164
7265 return $ answer ;
7366 }
74-
75- public function prepareRequest (Query $ query )
76- {
77- $ request = new Message ();
78- $ request ->header ->set ('id ' , rand ());
79- $ request ->header ->set ('rd ' , 1 );
80- $ request ->questions [] = (array ) $ query ;
81- $ request ->prepare ();
82-
83- return $ request ;
84- }
85-
86- public function doQuery ($ nameserver , $ transport , $ queryData , $ callback )
87- {
88- $ that = $ this ;
89- $ parser = $ this ->parser ;
90-
91- $ response = new Message ();
92-
93- $ retryWithTcp = function () use ($ that , $ nameserver , $ queryData , $ callback ) {
94- $ that ->doQuery ($ nameserver , 'tcp ' , $ queryData , $ callback );
95- };
96-
97- $ conn = $ this ->createConnection ($ nameserver , $ transport );
98- $ conn ->on ('data ' , function ($ data ) use ($ that , $ retryWithTcp , $ conn , $ parser , $ response , $ transport , $ callback ) {
99- $ responseReady = $ parser ->parseChunk ($ data , $ response );
100-
101- if (!$ responseReady ) {
102- return ;
103- }
104-
105- if ($ response ->header ->isTruncated ()) {
106- if ('tcp ' === $ transport ) {
107- throw new BadServerException ('The server set the truncated bit although we issued a TCP request ' );
108- }
109-
110- $ conn ->end ();
111- $ retryWithTcp ();
112- return ;
113- }
114-
115- $ conn ->end ();
116- $ callback ($ response );
117- });
118- $ conn ->write ($ queryData );
119- }
120-
121- protected function createConnection ($ nameserver , $ transport )
122- {
123- $ fd = stream_socket_client ("$ transport:// $ nameserver " );
124- $ conn = new Connection ($ fd , $ this ->loop );
125-
126- return $ conn ;
127- }
128-
129- protected function addPortToServerIfMissing ($ nameserver )
130- {
131- return false === strpos ($ nameserver , ': ' ) ? "$ nameserver:53 " : $ nameserver ;
132- }
13367}
0 commit comments