@@ -35,6 +35,42 @@ public function connectionToTcpServerShouldSucceedWithLocalhost()
35
35
$ server ->close ();
36
36
}
37
37
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
+
38
74
/**
39
75
* @test
40
76
* @group internet
0 commit comments