test-https.cc 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2025 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #include "client.h"
  19. #include "smartdns/dns.h"
  20. #include "include/utils.h"
  21. #include "server.h"
  22. #include "smartdns/util.h"
  23. #include "gtest/gtest.h"
  24. #include <fstream>
  25. class HTTPS : public ::testing::Test
  26. {
  27. protected:
  28. virtual void SetUp() {}
  29. virtual void TearDown() {}
  30. };
  31. TEST_F(HTTPS, ipv4_speed_prefer)
  32. {
  33. smartdns::MockServer server_upstream;
  34. smartdns::Server server;
  35. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  36. if (request->qtype != DNS_T_HTTPS) {
  37. return smartdns::SERVER_REQUEST_SOA;
  38. }
  39. struct dns_packet *packet = request->response_packet;
  40. struct dns_rr_nested svcparam_buffer;
  41. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "b.com");
  42. const char alph[] = "\x02h2\x05h3-19";
  43. int alph_len = sizeof(alph) - 1;
  44. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  45. dns_HTTPS_add_port(&svcparam_buffer, 443);
  46. unsigned char add_v4[] = {1, 2, 3, 4};
  47. unsigned char *addr[1] = {add_v4};
  48. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  49. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  50. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  51. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  52. addr[0] = add_v6;
  53. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  54. dns_add_HTTPS_end(&svcparam_buffer);
  55. return smartdns::SERVER_REQUEST_OK;
  56. });
  57. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
  58. server.Start(R"""(bind [::]:60053
  59. server 127.0.0.1:61053
  60. log-console yes
  61. dualstack-ip-selection no
  62. log-level debug
  63. cache-persist no)""");
  64. smartdns::Client client;
  65. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  66. std::cout << client.GetResult() << std::endl;
  67. ASSERT_EQ(client.GetAnswerNum(), 1);
  68. EXPECT_EQ(client.GetStatus(), "NOERROR");
  69. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  70. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  71. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  72. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 b.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  73. }
  74. TEST_F(HTTPS, ipv6_speed_prefer)
  75. {
  76. smartdns::MockServer server_upstream;
  77. smartdns::Server server;
  78. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  79. if (request->qtype != DNS_T_HTTPS) {
  80. return smartdns::SERVER_REQUEST_SOA;
  81. }
  82. struct dns_packet *packet = request->response_packet;
  83. struct dns_rr_nested svcparam_buffer;
  84. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "b.com");
  85. const char alph[] = "\x02h2\x05h3-19";
  86. int alph_len = sizeof(alph) - 1;
  87. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  88. dns_HTTPS_add_port(&svcparam_buffer, 443);
  89. unsigned char add_v4[] = {1, 2, 3, 4};
  90. unsigned char *addr[1] = {add_v4};
  91. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  92. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  93. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  94. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  95. addr[0] = add_v6;
  96. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  97. dns_add_HTTPS_end(&svcparam_buffer);
  98. return smartdns::SERVER_REQUEST_OK;
  99. });
  100. server.MockPing(PING_TYPE_ICMP, "102:304:506:708:90a:b0c:d0e:f10", 60, 10);
  101. server.Start(R"""(bind [::]:60053
  102. server 127.0.0.1:61053
  103. log-console yes
  104. dualstack-ip-selection no
  105. log-level debug
  106. cache-persist no)""");
  107. smartdns::Client client;
  108. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  109. std::cout << client.GetResult() << std::endl;
  110. ASSERT_EQ(client.GetAnswerNum(), 1);
  111. EXPECT_EQ(client.GetStatus(), "NOERROR");
  112. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  113. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  114. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  115. EXPECT_EQ(client.GetAnswer()[0].GetData(),
  116. "1 b.com. alpn=\"h2,h3-19\" port=443 ech=AEX+DQA= ipv6hint=102:304:506:708:90a:b0c:d0e:f10");
  117. }
  118. TEST_F(HTTPS, ipv4_SOA)
  119. {
  120. smartdns::MockServer server_upstream;
  121. smartdns::Server server;
  122. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  123. if (request->qtype != DNS_T_HTTPS) {
  124. return smartdns::SERVER_REQUEST_SOA;
  125. }
  126. struct dns_packet *packet = request->response_packet;
  127. struct dns_rr_nested svcparam_buffer;
  128. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  129. const char alph[] = "\x02h2\x05h3-19";
  130. int alph_len = sizeof(alph) - 1;
  131. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  132. dns_HTTPS_add_port(&svcparam_buffer, 443);
  133. unsigned char add_v4[] = {1, 2, 3, 4};
  134. unsigned char *addr[1] = {add_v4};
  135. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  136. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  137. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  138. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  139. addr[0] = add_v6;
  140. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  141. dns_add_HTTPS_end(&svcparam_buffer);
  142. return smartdns::SERVER_REQUEST_OK;
  143. });
  144. server.Start(R"""(bind [::]:60053
  145. server 127.0.0.1:61053
  146. log-console yes
  147. dualstack-ip-selection no
  148. address /a.com/#4
  149. log-level debug
  150. cache-persist no)""");
  151. smartdns::Client client;
  152. ASSERT_TRUE(client.Query("a.com HTTPS", 61053));
  153. std::cout << client.GetResult() << std::endl;
  154. ASSERT_EQ(client.GetAnswerNum(), 1);
  155. auto result_check = client.GetAnswer()[0].GetData();
  156. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  157. std::cout << client.GetResult() << std::endl;
  158. ASSERT_EQ(client.GetAnswerNum(), 1);
  159. EXPECT_EQ(client.GetStatus(), "NOERROR");
  160. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  161. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  162. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  163. EXPECT_EQ(client.GetAnswer()[0].GetData(),
  164. "1 a.com. alpn=\"h2,h3-19\" port=443 ech=AEX+DQA= ipv6hint=102:304:506:708:90a:b0c:d0e:f10");
  165. }
  166. TEST_F(HTTPS, ipv6_SOA)
  167. {
  168. smartdns::MockServer server_upstream;
  169. smartdns::Server server;
  170. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  171. if (request->qtype != DNS_T_HTTPS) {
  172. return smartdns::SERVER_REQUEST_SOA;
  173. }
  174. struct dns_packet *packet = request->response_packet;
  175. struct dns_rr_nested svcparam_buffer;
  176. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  177. const char alph[] = "\x02h2\x05h3-19";
  178. int alph_len = sizeof(alph) - 1;
  179. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  180. dns_HTTPS_add_port(&svcparam_buffer, 443);
  181. unsigned char add_v4[] = {1, 2, 3, 4};
  182. unsigned char *addr[1] = {add_v4};
  183. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  184. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  185. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  186. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  187. addr[0] = add_v6;
  188. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  189. dns_add_HTTPS_end(&svcparam_buffer);
  190. return smartdns::SERVER_REQUEST_OK;
  191. });
  192. server.Start(R"""(bind [::]:60053
  193. server 127.0.0.1:61053
  194. log-console yes
  195. dualstack-ip-selection no
  196. address /a.com/#6
  197. log-level debug
  198. cache-persist no)""");
  199. smartdns::Client client;
  200. ASSERT_TRUE(client.Query("a.com HTTPS", 61053));
  201. std::cout << client.GetResult() << std::endl;
  202. ASSERT_EQ(client.GetAnswerNum(), 1);
  203. auto result_check = client.GetAnswer()[0].GetData();
  204. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  205. std::cout << client.GetResult() << std::endl;
  206. ASSERT_EQ(client.GetAnswerNum(), 1);
  207. EXPECT_EQ(client.GetStatus(), "NOERROR");
  208. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  209. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  210. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  211. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 a.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  212. }
  213. TEST_F(HTTPS, UPSTREAM_SOA)
  214. {
  215. smartdns::MockServer server_upstream;
  216. smartdns::Server server;
  217. server_upstream.Start("udp://0.0.0.0:61053",
  218. [&](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  219. server.Start(R"""(bind [::]:60053
  220. server 127.0.0.1:61053
  221. log-console yes
  222. dualstack-ip-selection no
  223. address /a.com/#6
  224. log-level debug
  225. cache-persist no)""");
  226. smartdns::Client client;
  227. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  228. std::cout << client.GetResult() << std::endl;
  229. ASSERT_EQ(client.GetAuthorityNum(), 1);
  230. EXPECT_EQ(client.GetStatus(), "NXDOMAIN");
  231. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  232. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 3);
  233. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  234. }
  235. TEST_F(HTTPS, HTTPS_SOA)
  236. {
  237. smartdns::MockServer server_upstream;
  238. smartdns::Server server;
  239. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  240. if (request->qtype != DNS_T_HTTPS) {
  241. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  242. return smartdns::SERVER_REQUEST_OK;
  243. }
  244. if (request->qtype != DNS_T_HTTPS) {
  245. return smartdns::SERVER_REQUEST_SOA;
  246. }
  247. struct dns_packet *packet = request->response_packet;
  248. struct dns_rr_nested svcparam_buffer;
  249. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  250. const char alph[] = "\x02h2\x05h3-19";
  251. int alph_len = sizeof(alph) - 1;
  252. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  253. dns_HTTPS_add_port(&svcparam_buffer, 443);
  254. unsigned char add_v4[] = {1, 2, 3, 4};
  255. unsigned char *addr[1] = {add_v4};
  256. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  257. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  258. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  259. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  260. addr[0] = add_v6;
  261. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  262. dns_add_HTTPS_end(&svcparam_buffer);
  263. return smartdns::SERVER_REQUEST_OK;
  264. });
  265. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 100);
  266. server.Start(R"""(bind [::]:60053
  267. server 127.0.0.1:61053
  268. log-console yes
  269. dualstack-ip-selection no
  270. https-record /a.com/#
  271. log-level debug
  272. cache-persist no)""");
  273. smartdns::Client client;
  274. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  275. std::cout << client.GetResult() << std::endl;
  276. ASSERT_EQ(client.GetAuthorityNum(), 1);
  277. EXPECT_EQ(client.GetStatus(), "NOERROR");
  278. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  279. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  280. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  281. ASSERT_TRUE(client.Query("a.com A", 60053));
  282. std::cout << client.GetResult() << std::endl;
  283. ASSERT_EQ(client.GetAnswerNum(), 1);
  284. EXPECT_EQ(client.GetStatus(), "NOERROR");
  285. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  286. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  287. EXPECT_EQ(client.GetAnswer()[0].GetType(), "A");
  288. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
  289. }
  290. TEST_F(HTTPS, HTTPS_IGN)
  291. {
  292. smartdns::MockServer server_upstream;
  293. smartdns::Server server;
  294. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  295. if (request->qtype != DNS_T_HTTPS) {
  296. return smartdns::SERVER_REQUEST_SOA;
  297. }
  298. struct dns_packet *packet = request->response_packet;
  299. struct dns_rr_nested svcparam_buffer;
  300. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  301. const char alph[] = "\x02h2\x05h3-19";
  302. int alph_len = sizeof(alph) - 1;
  303. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  304. dns_HTTPS_add_port(&svcparam_buffer, 443);
  305. unsigned char add_v4[] = {1, 2, 3, 4};
  306. unsigned char *addr[1] = {add_v4};
  307. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  308. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  309. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  310. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  311. addr[0] = add_v6;
  312. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  313. dns_add_HTTPS_end(&svcparam_buffer);
  314. return smartdns::SERVER_REQUEST_OK;
  315. });
  316. server.Start(R"""(bind [::]:60053
  317. server 127.0.0.1:61053
  318. log-console yes
  319. dualstack-ip-selection no
  320. force-qtype-SOA 65
  321. https-record /a.com/-
  322. log-level debug
  323. cache-persist no)""");
  324. smartdns::Client client;
  325. ASSERT_TRUE(client.Query("b.com HTTPS", 60053));
  326. std::cout << client.GetResult() << std::endl;
  327. ASSERT_EQ(client.GetAuthorityNum(), 1);
  328. EXPECT_EQ(client.GetStatus(), "NOERROR");
  329. EXPECT_EQ(client.GetAuthority()[0].GetName(), "b.com");
  330. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  331. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  332. ASSERT_TRUE(client.Query("a.com HTTPS", 61053));
  333. std::cout << client.GetResult() << std::endl;
  334. ASSERT_EQ(client.GetAnswerNum(), 1);
  335. auto result_check = client.GetAnswer()[0].GetData();
  336. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  337. std::cout << client.GetResult() << std::endl;
  338. ASSERT_EQ(client.GetAnswerNum(), 1);
  339. EXPECT_EQ(client.GetStatus(), "NOERROR");
  340. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  341. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  342. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 a.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  343. }
  344. TEST_F(HTTPS, HTTPS_IGN_WITH_RULE)
  345. {
  346. smartdns::MockServer server_upstream;
  347. smartdns::Server server;
  348. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  349. if (request->qtype != DNS_T_HTTPS) {
  350. return smartdns::SERVER_REQUEST_SOA;
  351. }
  352. struct dns_packet *packet = request->response_packet;
  353. struct dns_rr_nested svcparam_buffer;
  354. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  355. const char alph[] = "\x02h2\x05h3-19";
  356. int alph_len = sizeof(alph) - 1;
  357. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  358. dns_HTTPS_add_port(&svcparam_buffer, 443);
  359. unsigned char add_v4[] = {1, 2, 3, 4};
  360. unsigned char *addr[1] = {add_v4};
  361. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  362. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  363. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  364. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  365. addr[0] = add_v6;
  366. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  367. dns_add_HTTPS_end(&svcparam_buffer);
  368. return smartdns::SERVER_REQUEST_OK;
  369. });
  370. server.Start(R"""(bind [::]:60053
  371. server 127.0.0.1:61053
  372. log-console yes
  373. dualstack-ip-selection no
  374. force-qtype-SOA 65
  375. https-record /a.com/noipv4hint,noipv6hint,noech
  376. log-level debug
  377. cache-persist no)""");
  378. smartdns::Client client;
  379. ASSERT_TRUE(client.Query("b.com HTTPS", 60053));
  380. std::cout << client.GetResult() << std::endl;
  381. ASSERT_EQ(client.GetAuthorityNum(), 1);
  382. EXPECT_EQ(client.GetStatus(), "NOERROR");
  383. EXPECT_EQ(client.GetAuthority()[0].GetName(), "b.com");
  384. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  385. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  386. ASSERT_TRUE(client.Query("a.com HTTPS", 61053));
  387. std::cout << client.GetResult() << std::endl;
  388. ASSERT_EQ(client.GetAnswerNum(), 1);
  389. auto result_check = client.GetAnswer()[0].GetData();
  390. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  391. std::cout << client.GetResult() << std::endl;
  392. ASSERT_EQ(client.GetAnswerNum(), 1);
  393. EXPECT_EQ(client.GetStatus(), "NOERROR");
  394. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  395. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  396. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 a.com. alpn=\"h2,h3-19\" port=443");
  397. }
  398. TEST_F(HTTPS, HTTPS_DOMAIN_RULE_IGN)
  399. {
  400. smartdns::MockServer server_upstream;
  401. smartdns::Server server;
  402. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  403. if (request->qtype != DNS_T_HTTPS) {
  404. return smartdns::SERVER_REQUEST_SOA;
  405. }
  406. struct dns_packet *packet = request->response_packet;
  407. struct dns_rr_nested svcparam_buffer;
  408. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  409. const char alph[] = "\x02h2\x05h3-19";
  410. int alph_len = sizeof(alph) - 1;
  411. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  412. dns_HTTPS_add_port(&svcparam_buffer, 443);
  413. unsigned char add_v4[] = {1, 2, 3, 4};
  414. unsigned char *addr[1] = {add_v4};
  415. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  416. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  417. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  418. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  419. addr[0] = add_v6;
  420. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  421. dns_add_HTTPS_end(&svcparam_buffer);
  422. return smartdns::SERVER_REQUEST_OK;
  423. });
  424. server.Start(R"""(bind [::]:60053
  425. server 127.0.0.1:61053
  426. log-console yes
  427. dualstack-ip-selection no
  428. address #
  429. domain-rules /a.com/ -https-record -
  430. log-level debug
  431. cache-persist no)""");
  432. smartdns::Client client;
  433. ASSERT_TRUE(client.Query("b.com HTTPS", 60053));
  434. std::cout << client.GetResult() << std::endl;
  435. ASSERT_EQ(client.GetAuthorityNum(), 1);
  436. EXPECT_EQ(client.GetStatus(), "NXDOMAIN");
  437. EXPECT_EQ(client.GetAuthority()[0].GetName(), "b.com");
  438. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  439. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  440. ASSERT_TRUE(client.Query("a.com HTTPS", 61053));
  441. std::cout << client.GetResult() << std::endl;
  442. ASSERT_EQ(client.GetAnswerNum(), 1);
  443. auto result_check = client.GetAnswer()[0].GetData();
  444. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  445. std::cout << client.GetResult() << std::endl;
  446. ASSERT_EQ(client.GetAnswerNum(), 1);
  447. EXPECT_EQ(client.GetStatus(), "NOERROR");
  448. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  449. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  450. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 a.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  451. }
  452. TEST_F(HTTPS, https_record)
  453. {
  454. smartdns::MockServer server_upstream;
  455. smartdns::Server server;
  456. server_upstream.Start("udp://0.0.0.0:61053",
  457. [&](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  458. server.Start(R"""(bind [::]:60053
  459. server 127.0.0.1:61053
  460. log-console yes
  461. dualstack-ip-selection no
  462. force-qtype-SOA 65
  463. https-record /a.com/target=b.com,port=1443,alpn=\"h2,h3-19\",ech=\"AEX+DQA=\",ipv4hint=1.2.3.4
  464. log-level debug
  465. cache-persist no)""");
  466. smartdns::Client client;
  467. ASSERT_TRUE(client.Query("b.com HTTPS", 60053));
  468. std::cout << client.GetResult() << std::endl;
  469. ASSERT_EQ(client.GetAuthorityNum(), 1);
  470. EXPECT_EQ(client.GetStatus(), "NOERROR");
  471. EXPECT_EQ(client.GetAuthority()[0].GetName(), "b.com");
  472. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  473. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  474. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  475. std::cout << client.GetResult() << std::endl;
  476. ASSERT_EQ(client.GetAnswerNum(), 1);
  477. EXPECT_EQ(client.GetStatus(), "NOERROR");
  478. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  479. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  480. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 b.com. alpn=\"h2,h3-19\" port=1443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  481. }
  482. TEST_F(HTTPS, filter_ip)
  483. {
  484. smartdns::MockServer server_upstream;
  485. smartdns::Server server;
  486. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  487. if (request->qtype != DNS_T_HTTPS) {
  488. return smartdns::SERVER_REQUEST_SOA;
  489. }
  490. struct dns_packet *packet = request->response_packet;
  491. struct dns_rr_nested svcparam_buffer;
  492. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "b.com");
  493. const char alph[] = "\x02h2\x05h3-19";
  494. int alph_len = sizeof(alph) - 1;
  495. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  496. dns_HTTPS_add_port(&svcparam_buffer, 443);
  497. unsigned char add_v4[] = {1, 2, 3, 4};
  498. unsigned char *addr[1] = {add_v4};
  499. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  500. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  501. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  502. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  503. addr[0] = add_v6;
  504. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  505. dns_add_HTTPS_end(&svcparam_buffer);
  506. return smartdns::SERVER_REQUEST_OK;
  507. });
  508. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
  509. server.Start(R"""(bind [::]:60053
  510. server 127.0.0.1:61053
  511. log-console yes
  512. dualstack-ip-selection no
  513. https-record noipv4hint,noipv6hint
  514. log-level debug
  515. cache-persist no)""");
  516. smartdns::Client client;
  517. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  518. std::cout << client.GetResult() << std::endl;
  519. ASSERT_EQ(client.GetAnswerNum(), 1);
  520. EXPECT_EQ(client.GetStatus(), "NOERROR");
  521. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  522. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  523. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  524. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 b.com. alpn=\"h2,h3-19\" port=443 ech=AEX+DQA=");
  525. }
  526. TEST_F(HTTPS, multi_not_support)
  527. {
  528. smartdns::MockServer server_upstream;
  529. smartdns::Server server;
  530. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  531. if (request->qtype != DNS_T_HTTPS) {
  532. return smartdns::SERVER_REQUEST_SOA;
  533. }
  534. struct dns_packet *packet = request->response_packet;
  535. struct dns_rr_nested svcparam_buffer;
  536. {
  537. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "b.com");
  538. const char alph[] = "\x02h2\x05h3-19";
  539. int alph_len = sizeof(alph) - 1;
  540. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  541. dns_HTTPS_add_port(&svcparam_buffer, 443);
  542. unsigned char add_v4[] = {1, 2, 3, 4};
  543. unsigned char *addr[1] = {add_v4};
  544. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  545. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  546. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  547. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  548. addr[0] = add_v6;
  549. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  550. dns_add_HTTPS_end(&svcparam_buffer);
  551. }
  552. {
  553. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "c.com");
  554. const char alph[] = "\x02h2\x05h3-19";
  555. int alph_len = sizeof(alph) - 1;
  556. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  557. dns_HTTPS_add_port(&svcparam_buffer, 443);
  558. unsigned char add_v4[] = {5, 6, 7, 8};
  559. unsigned char *addr[1] = {add_v4};
  560. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  561. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  562. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  563. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17};
  564. addr[0] = add_v6;
  565. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  566. dns_add_HTTPS_end(&svcparam_buffer);
  567. }
  568. return smartdns::SERVER_REQUEST_OK;
  569. });
  570. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
  571. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 10);
  572. server.Start(R"""(bind [::]:60053
  573. server 127.0.0.1:61053
  574. log-console yes
  575. dualstack-ip-selection no
  576. https-record noipv4hint,noipv6hint,noech
  577. log-level debug
  578. cache-persist no)""");
  579. smartdns::Client client;
  580. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  581. std::cout << client.GetResult() << std::endl;
  582. ASSERT_EQ(client.GetAnswerNum(), 2);
  583. EXPECT_EQ(client.GetStatus(), "NOERROR");
  584. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  585. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
  586. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  587. EXPECT_EQ(
  588. client.GetAnswer()[0].GetData(),
  589. "1 b.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA= ipv6hint=102:304:506:708:90a:b0c:d0e:f10");
  590. EXPECT_EQ(client.GetAnswer()[1].GetName(), "a.com");
  591. EXPECT_EQ(client.GetAnswer()[1].GetTTL(), 600);
  592. EXPECT_EQ(client.GetAnswer()[1].GetType(), "HTTPS");
  593. EXPECT_EQ(
  594. client.GetAnswer()[1].GetData(),
  595. "1 c.com. alpn=\"h2,h3-19\" port=443 ipv4hint=5.6.7.8 ech=AEX+DQA= ipv6hint=102:304:506:708:90a:b0c:d0e:f11");
  596. }
  597. TEST_F(HTTPS, BIND_FORCE_SOA)
  598. {
  599. smartdns::MockServer server_upstream;
  600. smartdns::Server server;
  601. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  602. if (request->qtype != DNS_T_HTTPS) {
  603. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  604. return smartdns::SERVER_REQUEST_OK;
  605. }
  606. if (request->qtype != DNS_T_HTTPS) {
  607. return smartdns::SERVER_REQUEST_SOA;
  608. }
  609. struct dns_packet *packet = request->response_packet;
  610. struct dns_rr_nested svcparam_buffer;
  611. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  612. const char alph[] = "\x02h2\x05h3-19";
  613. int alph_len = sizeof(alph) - 1;
  614. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  615. dns_HTTPS_add_port(&svcparam_buffer, 443);
  616. unsigned char add_v4[] = {1, 2, 3, 4};
  617. unsigned char *addr[1] = {add_v4};
  618. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  619. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  620. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  621. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  622. addr[0] = add_v6;
  623. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  624. dns_add_HTTPS_end(&svcparam_buffer);
  625. return smartdns::SERVER_REQUEST_OK;
  626. });
  627. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 100);
  628. server.Start(R"""(bind [::]:60053
  629. bind [::]:62053 -force-https-soa
  630. server 127.0.0.1:61053
  631. log-console yes
  632. dualstack-ip-selection no
  633. log-level debug
  634. cache-persist no)""");
  635. smartdns::Client client;
  636. ASSERT_TRUE(client.Query("a.com HTTPS", 62053));
  637. std::cout << client.GetResult() << std::endl;
  638. ASSERT_EQ(client.GetAuthorityNum(), 1);
  639. EXPECT_EQ(client.GetStatus(), "NOERROR");
  640. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  641. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  642. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  643. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  644. std::cout << client.GetResult() << std::endl;
  645. ASSERT_EQ(client.GetAnswerNum(), 1);
  646. EXPECT_EQ(client.GetStatus(), "NOERROR");
  647. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  648. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  649. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 a.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  650. }