test-https.cc 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  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_GT(client.GetAuthority()[0].GetTTL(), 595);
  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, multi_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,priority=1,port=1443,alpn=\"h2,h3-19\",ech=\"AEX+DQA=\",ipv4hint=1.2.3.4
  464. https-record /a.com/target=b.com,priority=2,port=2443,alpn=\"h2,h3-19\",ech=\"AEX+DQA=\",ipv4hint=1.2.3.4
  465. log-level debug
  466. cache-persist no)""");
  467. smartdns::Client client;
  468. ASSERT_TRUE(client.Query("b.com HTTPS", 60053));
  469. std::cout << client.GetResult() << std::endl;
  470. ASSERT_EQ(client.GetAuthorityNum(), 1);
  471. EXPECT_EQ(client.GetStatus(), "NOERROR");
  472. EXPECT_EQ(client.GetAuthority()[0].GetName(), "b.com");
  473. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  474. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  475. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  476. std::cout << client.GetResult() << std::endl;
  477. ASSERT_EQ(client.GetAnswerNum(), 2);
  478. EXPECT_EQ(client.GetStatus(), "NOERROR");
  479. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  480. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  481. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 b.com. alpn=\"h2,h3-19\" port=1443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  482. EXPECT_EQ(client.GetAnswer()[1].GetData(), "2 b.com. alpn=\"h2,h3-19\" port=2443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  483. }
  484. TEST_F(HTTPS, https_record)
  485. {
  486. smartdns::MockServer server_upstream;
  487. smartdns::Server server;
  488. server_upstream.Start("udp://0.0.0.0:61053",
  489. [&](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
  490. server.Start(R"""(bind [::]:60053
  491. server 127.0.0.1:61053
  492. log-console yes
  493. dualstack-ip-selection no
  494. force-qtype-SOA 65
  495. https-record /a.com/target=b.com,port=1443,alpn=\"h2,h3-19\",ech=\"AEX+DQA=\",ipv4hint=1.2.3.4
  496. log-level debug
  497. cache-persist no)""");
  498. smartdns::Client client;
  499. ASSERT_TRUE(client.Query("b.com HTTPS", 60053));
  500. std::cout << client.GetResult() << std::endl;
  501. ASSERT_EQ(client.GetAuthorityNum(), 1);
  502. EXPECT_EQ(client.GetStatus(), "NOERROR");
  503. EXPECT_EQ(client.GetAuthority()[0].GetName(), "b.com");
  504. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  505. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  506. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  507. std::cout << client.GetResult() << std::endl;
  508. ASSERT_EQ(client.GetAnswerNum(), 1);
  509. EXPECT_EQ(client.GetStatus(), "NOERROR");
  510. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  511. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  512. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 b.com. alpn=\"h2,h3-19\" port=1443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  513. }
  514. TEST_F(HTTPS, filter_ip)
  515. {
  516. smartdns::MockServer server_upstream;
  517. smartdns::Server server;
  518. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  519. if (request->qtype != DNS_T_HTTPS) {
  520. return smartdns::SERVER_REQUEST_SOA;
  521. }
  522. struct dns_packet *packet = request->response_packet;
  523. struct dns_rr_nested svcparam_buffer;
  524. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "b.com");
  525. const char alph[] = "\x02h2\x05h3-19";
  526. int alph_len = sizeof(alph) - 1;
  527. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  528. dns_HTTPS_add_port(&svcparam_buffer, 443);
  529. unsigned char add_v4[] = {1, 2, 3, 4};
  530. unsigned char *addr[1] = {add_v4};
  531. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  532. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  533. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  534. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  535. addr[0] = add_v6;
  536. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  537. dns_add_HTTPS_end(&svcparam_buffer);
  538. return smartdns::SERVER_REQUEST_OK;
  539. });
  540. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
  541. server.Start(R"""(bind [::]:60053
  542. server 127.0.0.1:61053
  543. log-console yes
  544. dualstack-ip-selection no
  545. https-record noipv4hint,noipv6hint
  546. log-level debug
  547. cache-persist no)""");
  548. smartdns::Client client;
  549. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  550. std::cout << client.GetResult() << std::endl;
  551. ASSERT_EQ(client.GetAnswerNum(), 1);
  552. EXPECT_EQ(client.GetStatus(), "NOERROR");
  553. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  554. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  555. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  556. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 b.com. alpn=\"h2,h3-19\" port=443 ech=AEX+DQA=");
  557. }
  558. TEST_F(HTTPS, multi_filter_ip)
  559. {
  560. smartdns::MockServer server_upstream;
  561. smartdns::Server server;
  562. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  563. if (request->qtype != DNS_T_HTTPS) {
  564. return smartdns::SERVER_REQUEST_SOA;
  565. }
  566. struct dns_packet *packet = request->response_packet;
  567. struct dns_rr_nested svcparam_buffer;
  568. {
  569. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 300, 1, "b.com");
  570. const char alph[] = "\x02h2\x05h3-19";
  571. int alph_len = sizeof(alph) - 1;
  572. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  573. dns_HTTPS_add_port(&svcparam_buffer, 443);
  574. unsigned char add_v4[] = {1, 2, 3, 4};
  575. unsigned char *addr[1] = {add_v4};
  576. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  577. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  578. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  579. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  580. addr[0] = add_v6;
  581. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  582. dns_add_HTTPS_end(&svcparam_buffer);
  583. }
  584. {
  585. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 300, 2, "c.com");
  586. const char alph[] = "\x02h2\x05h3-19";
  587. int alph_len = sizeof(alph) - 1;
  588. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  589. dns_HTTPS_add_port(&svcparam_buffer, 443);
  590. unsigned char add_v4[] = {5, 6, 7, 8};
  591. unsigned char *addr[1] = {add_v4};
  592. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  593. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  594. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  595. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17};
  596. addr[0] = add_v6;
  597. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  598. dns_add_HTTPS_end(&svcparam_buffer);
  599. }
  600. return smartdns::SERVER_REQUEST_OK;
  601. });
  602. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
  603. server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 10);
  604. server.Start(R"""(bind [::]:60053
  605. server 127.0.0.1:61053
  606. log-console yes
  607. dualstack-ip-selection no
  608. https-record noipv4hint,noipv6hint,noech
  609. log-level debug
  610. cache-persist no)""");
  611. smartdns::Client client;
  612. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  613. std::cout << client.GetResult() << std::endl;
  614. ASSERT_EQ(client.GetAnswerNum(), 2);
  615. EXPECT_EQ(client.GetStatus(), "NOERROR");
  616. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  617. EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
  618. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  619. EXPECT_EQ(
  620. client.GetAnswer()[0].GetData(),
  621. "1 b.com. alpn=\"h2,h3-19\" port=443");
  622. EXPECT_EQ(client.GetAnswer()[1].GetName(), "a.com");
  623. EXPECT_EQ(client.GetAnswer()[1].GetTTL(), 3);
  624. EXPECT_EQ(client.GetAnswer()[1].GetType(), "HTTPS");
  625. EXPECT_EQ(
  626. client.GetAnswer()[1].GetData(),
  627. "2 c.com. alpn=\"h2,h3-19\" port=443");
  628. }
  629. TEST_F(HTTPS, BIND_FORCE_SOA)
  630. {
  631. smartdns::MockServer server_upstream;
  632. smartdns::Server server;
  633. server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
  634. if (request->qtype != DNS_T_HTTPS) {
  635. smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
  636. return smartdns::SERVER_REQUEST_OK;
  637. }
  638. if (request->qtype != DNS_T_HTTPS) {
  639. return smartdns::SERVER_REQUEST_SOA;
  640. }
  641. struct dns_packet *packet = request->response_packet;
  642. struct dns_rr_nested svcparam_buffer;
  643. dns_add_HTTPS_start(&svcparam_buffer, packet, DNS_RRS_AN, request->domain.c_str(), 3, 1, "a.com");
  644. const char alph[] = "\x02h2\x05h3-19";
  645. int alph_len = sizeof(alph) - 1;
  646. dns_HTTPS_add_alpn(&svcparam_buffer, alph, alph_len);
  647. dns_HTTPS_add_port(&svcparam_buffer, 443);
  648. unsigned char add_v4[] = {1, 2, 3, 4};
  649. unsigned char *addr[1] = {add_v4};
  650. dns_HTTPS_add_ipv4hint(&svcparam_buffer, addr, 1);
  651. unsigned char ech[] = {0x00, 0x45, 0xfe, 0x0d, 0x00};
  652. dns_HTTPS_add_ech(&svcparam_buffer, (void *)ech, sizeof(ech));
  653. unsigned char add_v6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
  654. addr[0] = add_v6;
  655. dns_HTTPS_add_ipv6hint(&svcparam_buffer, addr, 1);
  656. dns_add_HTTPS_end(&svcparam_buffer);
  657. return smartdns::SERVER_REQUEST_OK;
  658. });
  659. server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 100);
  660. server.Start(R"""(bind [::]:60053
  661. bind [::]:62053 -force-https-soa
  662. server 127.0.0.1:61053
  663. log-console yes
  664. dualstack-ip-selection no
  665. log-level debug
  666. cache-persist no)""");
  667. smartdns::Client client;
  668. ASSERT_TRUE(client.Query("a.com HTTPS", 62053));
  669. std::cout << client.GetResult() << std::endl;
  670. ASSERT_EQ(client.GetAuthorityNum(), 1);
  671. EXPECT_EQ(client.GetStatus(), "NOERROR");
  672. EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
  673. EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 30);
  674. EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
  675. ASSERT_TRUE(client.Query("a.com HTTPS", 60053));
  676. std::cout << client.GetResult() << std::endl;
  677. ASSERT_EQ(client.GetAnswerNum(), 1);
  678. EXPECT_EQ(client.GetStatus(), "NOERROR");
  679. EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
  680. EXPECT_EQ(client.GetAnswer()[0].GetType(), "HTTPS");
  681. EXPECT_EQ(client.GetAnswer()[0].GetData(), "1 a.com. alpn=\"h2,h3-19\" port=443 ipv4hint=1.2.3.4 ech=AEX+DQA=");
  682. }