<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body>
VLC doesn't play hls streams over IPv6 addresses, and here is my patch.
<div>To test it, provide an hls stream on your pC, for example of mine:</div>
<div><br>
</div>
<div> (IPv4 version) http://127.0.0.1/hls/1_1080p.m3u8</div>
<div><br>
</div>
<div>It is happy to play this url with VLC, but fails on IPv6 url:</div>
<div><br>
</div>
<div> (IPv6 version) http://[::1]/hls/1_1080p.m3u8</div>
<div><br>
</div>
<div>For here, "::1" is IPv6 local loopback address. And according to RFC2732,</div>
<div>it should use IPv6 reference as host in URLs, as "[::1]".</div>
<div>IPv6 referenced URLs are ok for other players: gst-player-1.0, ffplay, etc.</div>
<div><br>
</div>
<div dir="auto" style="text-align: left;">---</div>
<div> modules/demux/adaptive/http/ConnectionParams.cpp | 62 +++++++++++++++++++++++-</div>
<div> modules/demux/adaptive/http/ConnectionParams.hpp | 2 +</div>
<div> modules/demux/adaptive/http/HTTPConnection.cpp | 14 +++++-</div>
<div> 3 files changed, 75 insertions(+), 3 deletions(-)</div>
<div><br>
</div>
<div>diff --git a/modules/demux/adaptive/http/ConnectionParams.cpp b/modules/demux/adaptive/http/ConnectionParams.cpp</div>
<div>index 6e3f221..9a632a8 100644</div>
<div>--- a/modules/demux/adaptive/http/ConnectionParams.cpp</div>
<div>+++ b/modules/demux/adaptive/http/ConnectionParams.cpp</div>
<div>@@ -69,7 +69,10 @@ void ConnectionParams::setPath(const std::string &path_)</div>
<div>     os << scheme << "://";</div>
<div>     if(!hostname.empty())</div>
<div>     {</div>
<div>- os << hostname;</div>
<div>+ if (ipv6)</div>
<div>+ os << '[' << hostname << ']';</div>
<div>+ else</div>
<div>+ os << hostname;</div>
<div>         if( (port != 80 && scheme != "http") ||</div>
<div>             (port != 443 && scheme != "https") )</div>
<div>             os << ":" << port;</div>
<div>@@ -88,6 +91,60 @@ bool ConnectionParams::isLocal() const</div>
<div>     return scheme != "http" && scheme != "https";</div>
<div> }</div>
<div> </div>
<div>+bool isIPv6() const;</div>
<div>+{</div>
<div>+ return ipv6;</div>
<div>+}</div>
<div>+</div>
<div>+static int is_ipv6_addr (const char * host)</div>
<div>+{</div>
<div>+ const char * p;</div>
<div>+ unsigned colons = 0, nums = 0, decs = 0, dots = 0;</div>
<div>+ if (!host)</div>
<div>+ {</div>
<div>+ return 0;</div>
<div>+ }</div>
<div>+ for (p = host; *p; p++)</div>
<div>+ {</div>
<div>+ char c = *p;</div>
<div>+ if (c == ':')</div>
<div>+ {</div>
<div>+ colons ++;</div>
<div>+ if (nums > 4)</div>
<div>+ {</div>
<div>+ return 0;</div>
<div>+ }</div>
<div>+ nums = 0;</div>
<div>+ decs = 0;</div>
<div>+ }</div>
<div>+ else if (('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'))</div>
<div>+ {</div>
<div>+ if ('0' <= c && c <= '9')</div>
<div>+ {</div>
<div>+ decs ++;</div>
<div>+ }</div>
<div>+ nums ++;</div>
<div>+ }</div>
<div>+ else if (c == '.')</div>
<div>+ {</div>
<div>+ dots ++;</div>
<div>+ if (nums != decs)</div>
<div>+ {</div>
<div>+ return 0;</div>
<div>+ }</div>
<div>+ if (nums == 0 || 3 < nums)</div>
<div>+ {</div>
<div>+ return 0;</div>
<div>+ }</div>
<div>+ }</div>
<div>+ else</div>
<div>+ {</div>
<div>+ return 0;</div>
<div>+ }</div>
<div>+ }</div>
<div>+ return 2 <= colons && colons <= 7 && (dots == 0 || dots == 3);</div>
<div>+}</div>
<div>+</div>
<div> void ConnectionParams::parse()</div>
<div> {</div>
<div>     vlc_url_t url_components;</div>
<div>@@ -108,7 +165,10 @@ void ConnectionParams::parse()</div>
<div>     port = url_components.i_port ? url_components.i_port :</div>
<div>                          ((scheme == "https") ? 443 : 80);</div>
<div>     if(url_components.psz_host)</div>
<div>+ {</div>
<div>         hostname = url_components.psz_host;</div>
<div>+ ipv6 = is_ipv6_addr(url_components.psz_host);</div>
<div>+ }</div>
<div> </div>
<div>     vlc_UrlClean(&url_components);</div>
<div> }</div>
<div>diff --git a/modules/demux/adaptive/http/ConnectionParams.hpp b/modules/demux/adaptive/http/ConnectionParams.hpp</div>
<div>index fb9f9d9..868bd97 100644</div>
<div>--- a/modules/demux/adaptive/http/ConnectionParams.hpp</div>
<div>+++ b/modules/demux/adaptive/http/ConnectionParams.hpp</div>
<div>@@ -62,6 +62,7 @@ namespace adaptive</div>
<div>                 bool isLocal() const;</div>
<div>                 void setPath(const std::string &);</div>
<div>                 uint16_t getPort() const;</div>
<div>+ bool isIPv6() const;</div>
<div> </div>
<div>             private:</div>
<div>                 void parse();</div>
<div>@@ -70,6 +71,7 @@ namespace adaptive</div>
<div>                 std::string hostname;</div>
<div>                 std::string path;</div>
<div>                 uint16_t port;</div>
<div>+ bool ipv6;</div>
<div>         };</div>
<div>     }</div>
<div> }</div>
<div>diff --git a/modules/demux/adaptive/http/HTTPConnection.cpp b/modules/demux/adaptive/http/HTTPConnection.cpp</div>
<div>index 36354c5..e103440 100644</div>
<div>--- a/modules/demux/adaptive/http/HTTPConnection.cpp</div>
<div>+++ b/modules/demux/adaptive/http/HTTPConnection.cpp</div>
<div>@@ -432,11 +432,21 @@ std::string HTTPConnection::buildRequestHeader(const std::string &path) const</div>
<div>     if((params.getScheme() == "http" && params.getPort() != 80) ||</div>
<div>             (params.getScheme() == "https" && params.getPort() != 443))</div>
<div>     {</div>
<div>- req << "Host: " << params.getHostname() << ":" << params.getPort() << "\r\n";</div>
<div>+ req << "Host: ";</div>
<div>+ if (params.isIPv6())</div>
<div>+ req << '[' << params.getHostname() << ']';</div>
<div>+ else</div>
<div>+ req << params.getHostname();</div>
<div>+ req << ":" << params.getPort() << "\r\n";</div>
<div>     }</div>
<div>     else</div>
<div>     {</div>
<div>- req << "Host: " << params.getHostname() << "\r\n";</div>
<div>+ req << "Host: ";</div>
<div>+ if (params.isIPv6())</div>
<div>+ req << '[' << params.getHostname() << ']';</div>
<div>+ else</div>
<div>+ req << params.getHostname();</div>
<div>+ req << "\r\n";</div>
<div>     }</div>
<div>     if(authStorage)</div>
<div>     {</div>
<div>-- </div>
<div>2.7.4</div>
<div><br>
</div>
</body>
</html>