Browse Source

Allow hex for ip6 literal addr, fix #1800 (#1830)

* Allow hex for ip6 literal addr, fix #1800

* Add UT for ipv6 + Universal client implementation

* add /n at EOF
Sean Quinn 1 year ago
parent
commit
98cc1ec344
2 changed files with 18 additions and 1 deletions
  1. 3 1
      httplib.h
  2. 15 0
      test/test.cc

+ 3 - 1
httplib.h

@@ -9213,7 +9213,7 @@ inline Client::Client(const std::string &scheme_host_port,
                       const std::string &client_cert_path,
                       const std::string &client_key_path) {
   const static std::regex re(
-      R"((?:([a-z]+):\/\/)?(?:\[([\d:]+)\]|([^:/?#]+))(?::(\d+))?)");
+      R"((?:([a-z]+):\/\/)?(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)");
 
   std::smatch m;
   if (std::regex_match(scheme_host_port, m, re)) {
@@ -9250,6 +9250,8 @@ inline Client::Client(const std::string &scheme_host_port,
                                              client_key_path);
     }
   } else {
+    // NOTE: Update TEST(UniversalClientImplTest, Ipv6LiteralAddress)
+    // if port param below changes.
     cli_ = detail::make_unique<ClientImpl>(scheme_host_port, 80,
                                            client_cert_path, client_key_path);
   }

+ 15 - 0
test/test.cc

@@ -7373,3 +7373,18 @@ TEST(PathParamsTest, SequenceOfParams) {
 
   EXPECT_EQ(request.path_params, expected_params);
 }
+
+TEST(UniversalClientImplTest, Ipv6LiteralAddress) {
+  // If ipv6 regex working, regex match codepath is taken.
+  // else port will default to 80 in Client impl
+  int clientImplMagicPort = 80;
+  int port = 4321;
+  // above ports must be different to avoid false negative
+  EXPECT_NE(clientImplMagicPort, port);
+
+  std::string ipV6TestURL = "http://[ff06::c3]";
+
+  Client cli(ipV6TestURL + ":" + std::to_string(port), CLIENT_CERT_FILE,
+               CLIENT_PRIVATE_KEY_FILE);
+  EXPECT_EQ(cli.port(), port);
+}