@@ -35,6 +35,42 @@ public function connectionToTcpServerShouldSucceedWithLocalhost()
3535 $ server ->close ();
3636 }
3737
38+ /**
39+ * @group internet
40+ */
41+ public function testConnectTwiceWithoutHappyEyeBallsOnlySendsSingleDnsQueryDueToLocalDnsCache ()
42+ {
43+ $ loop = Factory::create ();
44+
45+ $ socket = stream_socket_server ('udp://127.0.0.1:0 ' , $ errno , $ errstr , STREAM_SERVER_BIND );
46+
47+ $ connector = new Connector ($ loop , array (
48+ 'dns ' => 'udp:// ' . stream_socket_get_name ($ socket , false ),
49+ 'happy_eyeballs ' => false
50+ ));
51+
52+ // minimal DNS proxy stub which forwards DNS messages to actual DNS server
53+ $ received = 0 ;
54+ $ loop ->addReadStream ($ socket , function ($ socket ) use (&$ received ) {
55+ $ request = stream_socket_recvfrom ($ socket , 65536 , 0 , $ peer );
56+
57+ $ client = stream_socket_client ('udp://8.8.8.8:53 ' );
58+ fwrite ($ client , $ request );
59+ $ response = fread ($ client , 65536 );
60+
61+ stream_socket_sendto ($ socket , $ response , 0 , $ peer );
62+ ++$ received ;
63+ });
64+
65+ $ connection = Block \await ($ connector ->connect ('example.com:80 ' ), $ loop );
66+ $ connection ->close ();
67+ $ this ->assertEquals (1 , $ received );
68+
69+ $ connection = Block \await ($ connector ->connect ('example.com:80 ' ), $ loop );
70+ $ connection ->close ();
71+ $ this ->assertEquals (1 , $ received );
72+ }
73+
3874 /**
3975 * @test
4076 * @group internet
0 commit comments