From 90a131bd294f3d3c04dffbac12289d95d6be1743 Mon Sep 17 00:00:00 2001
From: Sergey Lyubka <valenok@gmail.com>
Date: Tue, 21 Sep 2021 08:10:27 +0100
Subject: [PATCH] Include ipv6 wrapping brackets [] in the result of
 mg_url_host()

---
 docs/README.md   | 7 ++++---
 mongoose.c       | 7 ++-----
 src/net.c        | 1 +
 src/url.c        | 6 +-----
 test/unit_test.c | 4 ++--
 5 files changed, 10 insertions(+), 15 deletions(-)

diff --git a/docs/README.md b/docs/README.md
index 4297e6699..1e92e3b63 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -2499,7 +2499,7 @@ bool mg_aton(struct mg_str str, struct mg_addr *addr);
 Parse IP address held by `str` and store it in `addr`.
 
 Parameters:
-- `str` - string to parse
+- `str` - string to parse, for example `1.2.3.4`, `[::1]`, `01:02::03`
 - `addr` - pointer to `mg_addr` string to receive parsed value
 
 Return value: `true` on success, `false` otherwise.
@@ -3285,14 +3285,15 @@ struct mg_str mg_url_host(const char *url);
 Extract host name from given URL.
 
 Parameters:
-- `url` - URL to extract host
+- `url` - a URL string
 
 Return value: host name
 
 Usage example:
 
 ```c
-struct mg_str host = mg_url_host("https://my.example.org:1234"); // host is now "my.example.org"
+struct mg_str a = mg_url_host("https://my.example.org:1234"); // a == "my.example.org"
+struct mg_str b = mg_url_host("tcp://[::1]"); // b == "[::1]"
 ```
 
 ### mg\_url\_user()
diff --git a/mongoose.c b/mongoose.c
index 6530a93c1..f9eb8001b 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -2439,6 +2439,7 @@ static bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {
 
 static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
   size_t i, j = 0, n = 0, dc = 42;
+  if (str.len > 2 && str.ptr[0] == '[') str.ptr++, str.len -= 2;
   if (mg_v4mapped(str, addr)) return true;
   for (i = 0; i < str.len; i++) {
     if ((str.ptr[i] >= '0' && str.ptr[i] <= '9') ||
@@ -4048,8 +4049,8 @@ long mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {
 #ifdef MG_ENABLE_LINES
 #line 1 "src/url.c"
 #endif
-#include <stdlib.h>
 
+#include <stdlib.h>
 
 struct url {
   size_t key, user, pass, host, port, uri, end;
@@ -4095,10 +4096,6 @@ struct mg_str mg_url_host(const char *url) {
              : u.uri ? u.uri - u.host
                      : u.end - u.host;
   struct mg_str s = mg_str_n(url + u.host, n);
-  if (s.len > 2 && s.ptr[0] == '[' && s.ptr[s.len - 1] == ']') {
-    s.len -= 2;
-    s.ptr++;
-  }
   return s;
 }
 
diff --git a/src/net.c b/src/net.c
index fc411a0e7..5104b953e 100644
--- a/src/net.c
+++ b/src/net.c
@@ -87,6 +87,7 @@ static bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {
 
 static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
   size_t i, j = 0, n = 0, dc = 42;
+  if (str.len > 2 && str.ptr[0] == '[') str.ptr++, str.len -= 2;
   if (mg_v4mapped(str, addr)) return true;
   for (i = 0; i < str.len; i++) {
     if ((str.ptr[i] >= '0' && str.ptr[i] <= '9') ||
diff --git a/src/url.c b/src/url.c
index 0e9d76672..c2064a590 100644
--- a/src/url.c
+++ b/src/url.c
@@ -1,5 +1,5 @@
-#include <stdlib.h>
 #include "url.h"
+#include <stdlib.h>
 
 struct url {
   size_t key, user, pass, host, port, uri, end;
@@ -45,10 +45,6 @@ struct mg_str mg_url_host(const char *url) {
              : u.uri ? u.uri - u.host
                      : u.end - u.host;
   struct mg_str s = mg_str_n(url + u.host, n);
-  if (s.len > 2 && s.ptr[0] == '[' && s.ptr[s.len - 1] == ']') {
-    s.len -= 2;
-    s.ptr++;
-  }
   return s;
 }
 
diff --git a/test/unit_test.c b/test/unit_test.c
index fd85ee62f..42391149a 100644
--- a/test/unit_test.c
+++ b/test/unit_test.c
@@ -135,8 +135,8 @@ static void test_url(void) {
   ASSERT(vcmp(mg_url_host("p://bar:1234/a"), "bar"));
   ASSERT(vcmp(mg_url_host("p://u@bar:1234/a"), "bar"));
   ASSERT(vcmp(mg_url_host("p://u:p@bar:1234/a"), "bar"));
-  ASSERT(vcmp(mg_url_host("p://u:p@[::1]:1234/a"), "::1"));
-  ASSERT(vcmp(mg_url_host("p://u:p@[1:2::3]:1234/a"), "1:2::3"));
+  ASSERT(vcmp(mg_url_host("p://u:p@[::1]:1234/a"), "[::1]"));
+  ASSERT(vcmp(mg_url_host("p://u:p@[1:2::3]:1234/a"), "[1:2::3]"));
   ASSERT(vcmp(mg_url_host("p://foo/x:y/z"), "foo"));
 
   // Port
-- 
GitLab