This is an automated email from the ASF dual-hosted git repository.

bnolsen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 48862f272d URL.cc: url_length_get consider ipv6 address with added [] 
(#10387)
48862f272d is described below

commit 48862f272d8701aaf58940418e59d3a9a822c9a3
Author: Brian Olsen <[email protected]>
AuthorDate: Fri Sep 8 11:12:49 2023 -0600

    URL.cc: url_length_get consider ipv6 address with added [] (#10387)
---
 proxy/hdrs/URL.cc                |  8 ++++++++
 src/traffic_server/InkAPITest.cc | 30 +++++++++++++++++++++++++++++-
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/proxy/hdrs/URL.cc b/proxy/hdrs/URL.cc
index 3b053699e2..73c85666af 100644
--- a/proxy/hdrs/URL.cc
+++ b/proxy/hdrs/URL.cc
@@ -856,6 +856,14 @@ url_length_get(URLImpl *url, unsigned normalization_flags)
   }
 
   if (url->m_ptr_host) {
+    // Force brackets for IPv6. Note colon must occur in first 5 characters.
+    // But it can be less (e.g. "::1").
+    int const n          = url->m_len_host;
+    bool const bracket_p = '[' != *url->m_ptr_host && (nullptr != 
memchr(url->m_ptr_host, ':', n > 5 ? 5 : n));
+    if (bracket_p) {
+      length += 2;
+    }
+
     length += url->m_len_host;
     if (url->m_ptr_port && url->m_port) {
       length += url->m_len_port + 1; // +1 for ":"
diff --git a/src/traffic_server/InkAPITest.cc b/src/traffic_server/InkAPITest.cc
index b07b02fd8f..e922c132be 100644
--- a/src/traffic_server/InkAPITest.cc
+++ b/src/traffic_server/InkAPITest.cc
@@ -35,6 +35,7 @@
 #include <unistd.h>
 #include <cstdio>
 #include <cstring>
+#include <regex>
 
 #include "tscore/ink_config.h"
 #include "tscore/ink_sprintf.h"
@@ -3804,6 +3805,7 @@ REGRESSION_TEST(SDK_API_TSUrl)(RegressionTest *test, int 
/* atype ATS_UNUSED */,
   int type = 'a';
   int type_get;
   int tmp_len;
+  char const *const hostipv6 = "2345:0425:2CA1::0567:5673:23b5";
 
   bool test_passed_create   = false;
   bool test_passed_scheme   = false;
@@ -3823,6 +3825,7 @@ REGRESSION_TEST(SDK_API_TSUrl)(RegressionTest *test, int 
/* atype ATS_UNUSED */,
   bool test_passed_length1  = false;
   bool test_passed_length2  = false;
   bool test_passed_type     = false;
+  bool test_passed_ipv6     = false;
 
   int length;
 
@@ -4071,6 +4074,30 @@ REGRESSION_TEST(SDK_API_TSUrl)(RegressionTest *test, int 
/* atype ATS_UNUSED */,
     }
   }
 
+  // test url_print correctly add surrounding [] for ipv6 address
+  if (TSUrlHostSet(bufp2, url_loc2, hostipv6, -1) != TS_SUCCESS) {
+    SDK_RPRINT(test, "TSUrlHostSet", hostipv6, TC_FAIL, "Returned TS_ERROR");
+  } else {
+    int len          = 0;
+    char *const temp = TSUrlStringGet(bufp2, url_loc2, &len);
+    if (nullptr == temp) {
+      SDK_RPRINT(test, "TSUrlStringGet", hostipv6, TC_FAIL, "Returned 
nullptr");
+    } else {
+      std::string const got(temp, len);
+      std::string const hipv6 = std::string("[") + hostipv6 + "]";
+      std::string const exp   = std::regex_replace(url_expected_string, 
std::regex(host), hipv6);
+
+      if (got != exp) {
+        SDK_RPRINT(test, "TSUrlStringGet", got.c_str(), TC_FAIL, "Returned 
unexpected result");
+      } else {
+        SDK_RPRINT(test, "TSUrlStringGet_ipv6", exp.c_str(), TC_PASS, "ok");
+        test_passed_ipv6 = true;
+      }
+
+      TSfree(temp);
+    }
+  }
+
   SDK_RPRINT(test, "TSUrlCreate", "TestCase1&2", TC_PASS, "ok");
   TSHandleMLocRelease(bufp1, TS_NULL_MLOC, url_loc1);
   TSHandleMLocRelease(bufp2, TS_NULL_MLOC, url_loc2);
@@ -4102,7 +4129,8 @@ print_results:
       (test_passed_path == false) || (test_passed_params == false) || 
(test_passed_query == false) ||
       (test_passed_fragment == false) || (test_passed_copy == false) || 
(test_passed_clone == false) ||
       (test_passed_string1 == false) || (test_passed_string2 == false) || 
(test_passed_print == false) ||
-      (test_passed_length1 == false) || (test_passed_length2 == false) || 
(test_passed_type == false)) {
+      (test_passed_length1 == false) || (test_passed_length2 == false) || 
(test_passed_type == false) ||
+      (test_passed_ipv6 == false)) {
     /*** Debugging the test itself....
     (test_passed_create == false)?printf("test_passed_create is 
false\n"):printf("");
     (test_passed_destroy == false)?printf("test_passed_destroy is 
false\n"):printf("");

Reply via email to