From 1e612f24435d6bab0965dac6c7c3b47f7e694efd Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Thu, 21 Apr 2022 13:15:11 +0200 Subject: [PATCH] server: fix reading with ffplay and stateless ipv6 --- pkg/base/url.go | 4 ++++ pkg/base/url_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/pkg/base/url.go b/pkg/base/url.go index c08ce4af..46d1ec4e 100644 --- a/pkg/base/url.go +++ b/pkg/base/url.go @@ -3,6 +3,7 @@ package base import ( "fmt" "net/url" + "strings" ) // URL is a RTSP URL. @@ -12,6 +13,9 @@ type URL url.URL // ParseURL parses a RTSP URL. func ParseURL(s string) (*URL, error) { + s = strings.ReplaceAll(s, "%25", "%") + s = strings.ReplaceAll(s, "%", "%25") + u, err := url.Parse(s) if err != nil { return nil, err diff --git a/pkg/base/url_test.go b/pkg/base/url_test.go index 81074d7f..930e3e43 100644 --- a/pkg/base/url_test.go +++ b/pkg/base/url_test.go @@ -14,6 +14,30 @@ func mustParseURL(s string) *URL { return u } +func TestURLParse(t *testing.T) { + for _, ca := range []struct { + name string + enc string + u *URL + }{ + { + "ipv6 stateless", + `rtsp://[fe80::a8f4:3219:f33e:a072%wl0]:8554/proxied`, + &URL{ + Scheme: "rtsp", + Host: "[fe80::a8f4:3219:f33e:a072%wl0]:8554", + Path: "/proxied", + }, + }, + } { + t.Run(ca.name, func(t *testing.T) { + u, err := ParseURL(ca.enc) + require.NoError(t, err) + require.Equal(t, ca.u, u) + }) + } +} + func TestURLParseErrors(t *testing.T) { for _, ca := range []struct { name string