@@ -13,7 +13,7 @@ class Resolver
1313
1414 public function __construct ($ nameserver , LoopInterface $ loop )
1515 {
16- $ this ->nameserver = $ nameserver ;
16+ $ this ->nameserver = $ this -> addPortToServerIfMissing ( $ nameserver) ;
1717 $ this ->loop = $ loop ;
1818 }
1919
@@ -39,16 +39,37 @@ public function query($nameserver, Query $query, $callback)
3939 $ request ->questions [] = (array ) $ query ;
4040 $ request ->prepare ();
4141
42+ $ queryData = $ dumper ->toBinary ($ request );
43+ $ transport = strlen ($ queryData ) > 512 ? 'tcp ' : 'udp ' ;
44+
45+ $ this ->doQuery ($ nameserver , $ transport , $ queryData , $ parser , $ callback );
46+ }
47+
48+ public function doQuery ($ nameserver , $ transport , $ queryData , Parser $ parser , $ callback )
49+ {
50+ $ that = $ this ;
51+
4252 $ response = new Message ();
4353
44- $ fd = stream_socket_client ("udp ://$ nameserver:53 " );
54+ $ fd = stream_socket_client ("$ transport :// $ nameserver " );
4555 $ conn = new Connection ($ fd , $ this ->loop );
46- $ conn ->on ('data ' , function ($ data ) use ($ conn , $ parser , $ response , $ callback ) {
47- if ($ parser ->parseChunk ($ data , $ response )) {
56+ $ conn ->on ('data ' , function ($ data ) use ($ that , $ conn , $ parser , $ response , $ callback ) {
57+ $ responseReady = $ parser ->parseChunk ($ data , $ response );
58+ if ($ responseReady ) {
59+ if ($ response ->headers ->isTruncated ()) {
60+ $ conn ->end ();
61+ $ that ->doQuery ($ nameserver , 'tcp ' , $ queryData , $ parser , $ callback );
62+ return ;
63+ }
4864 $ conn ->end ();
4965 $ callback ($ response );
5066 }
5167 });
52- $ conn ->write ($ dumper ->toBinary ($ request ));
68+ $ conn ->write ($ queryData );
69+ }
70+
71+ private function addPortToServerIfMissing ($ nameserver )
72+ {
73+ return false === strpos ($ nameserver , ': ' ) ? "$ nameserver:53 " : $ nameserver ;
5374 }
5475}
0 commit comments