@@ -147,7 +147,7 @@ public function __construct($nameserver, LoopInterface $loop)
147147 throw new \InvalidArgumentException ('Invalid nameserver address given ' );
148148 }
149149
150- $ this ->nameserver = $ parts ['host ' ] . ': ' . (isset ($ parts ['port ' ]) ? $ parts ['port ' ] : 53 );
150+ $ this ->nameserver = ' tcp:// ' . $ parts ['host ' ] . ': ' . (isset ($ parts ['port ' ]) ? $ parts ['port ' ] : 53 );
151151 $ this ->loop = $ loop ;
152152 $ this ->parser = new Parser ();
153153 $ this ->dumper = new BinaryDumper ();
@@ -166,7 +166,7 @@ public function query(Query $query)
166166 $ length = \strlen ($ queryData );
167167 if ($ length > 0xffff ) {
168168 return \React \Promise \reject (new \RuntimeException (
169- 'DNS query for ' . $ query ->name . ' failed: Query too large for TCP transport '
169+ 'DNS query for ' . $ query ->describe () . ' failed: Query too large for TCP transport '
170170 ));
171171 }
172172
@@ -177,7 +177,7 @@ public function query(Query $query)
177177 $ socket = @\stream_socket_client ($ this ->nameserver , $ errno , $ errstr , 0 , \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT );
178178 if ($ socket === false ) {
179179 return \React \Promise \reject (new \RuntimeException (
180- 'DNS query for ' . $ query ->name . ' failed: Unable to connect to DNS server ( ' . $ errstr . ') ' ,
180+ 'DNS query for ' . $ query ->describe () . ' failed: Unable to connect to DNS server ' . $ this -> nameserver . ' ( ' . $ errstr . ') ' ,
181181 $ errno
182182 ));
183183 }
@@ -214,7 +214,7 @@ public function query(Query $query)
214214 });
215215
216216 $ this ->pending [$ request ->id ] = $ deferred ;
217- $ this ->names [$ request ->id ] = $ query ->name ;
217+ $ this ->names [$ request ->id ] = $ query ->describe () ;
218218
219219 return $ deferred ->promise ();
220220 }
@@ -227,7 +227,19 @@ public function handleWritable()
227227 if ($ this ->readPending === false ) {
228228 $ name = @\stream_socket_get_name ($ this ->socket , true );
229229 if ($ name === false ) {
230- $ this ->closeError ('Connection to DNS server rejected ' );
230+ // Connection failed? Check socket error if available for underlying errno/errstr.
231+ // @codeCoverageIgnoreStart
232+ if (\function_exists ('socket_import_stream ' )) {
233+ $ socket = \socket_import_stream ($ this ->socket );
234+ $ errno = \socket_get_option ($ socket , \SOL_SOCKET , \SO_ERROR );
235+ $ errstr = \socket_strerror ($ errno );
236+ } else {
237+ $ errno = \defined ('SOCKET_ECONNREFUSED ' ) ? \SOCKET_ECONNREFUSED : 111 ;
238+ $ errstr = 'Connection refused ' ;
239+ }
240+ // @codeCoverageIgnoreEnd
241+
242+ $ this ->closeError ('Unable to connect to DNS server ' . $ this ->nameserver . ' ( ' . $ errstr . ') ' , $ errno );
231243 return ;
232244 }
233245
@@ -240,7 +252,7 @@ public function handleWritable()
240252 $ error = \error_get_last ();
241253 \preg_match ('/errno=(\d+) (.+)/ ' , $ error ['message ' ], $ m );
242254 $ this ->closeError (
243- 'Unable to send query to DNS server ( ' . (isset ($ m [2 ]) ? $ m [2 ] : $ error ['message ' ]) . ') ' ,
255+ 'Unable to send query to DNS server ' . $ this -> nameserver . ' ( ' . (isset ($ m [2 ]) ? $ m [2 ] : $ error ['message ' ]) . ') ' ,
244256 isset ($ m [1 ]) ? (int ) $ m [1 ] : 0
245257 );
246258 return ;
@@ -264,7 +276,7 @@ public function handleRead()
264276 // any error is fatal, this is a stream of TCP/IP data
265277 $ chunk = @\fread ($ this ->socket , 65536 );
266278 if ($ chunk === false || $ chunk === '' ) {
267- $ this ->closeError ('Connection to DNS server lost ' );
279+ $ this ->closeError ('Connection to DNS server ' . $ this -> nameserver . ' lost ' );
268280 return ;
269281 }
270282
@@ -286,13 +298,13 @@ public function handleRead()
286298 $ response = $ this ->parser ->parseMessage ($ data );
287299 } catch (\Exception $ e ) {
288300 // reject all pending queries if we received an invalid message from remote server
289- $ this ->closeError ('Invalid message received from DNS server ' );
301+ $ this ->closeError ('Invalid message received from DNS server ' . $ this -> nameserver );
290302 return ;
291303 }
292304
293305 // reject all pending queries if we received an unexpected response ID or truncated response
294306 if (!isset ($ this ->pending [$ response ->id ]) || $ response ->tc ) {
295- $ this ->closeError ('Invalid response message received from DNS server ' );
307+ $ this ->closeError ('Invalid response message received from DNS server ' . $ this -> nameserver );
296308 return ;
297309 }
298310
0 commit comments