From 6fe7a316bad54e8dfb7be47321c87d014ea80fe6 Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Tue, 10 May 2022 17:32:11 +0200 Subject: [PATCH] restore support for cameras with percent sign in password, broken after 1e612f2 --- pkg/base/url.go | 12 ++++++++++-- pkg/base/url_test.go | 6 ++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pkg/base/url.go b/pkg/base/url.go index 46d1ec4e..e6f9e279 100644 --- a/pkg/base/url.go +++ b/pkg/base/url.go @@ -3,6 +3,7 @@ package base import ( "fmt" "net/url" + "regexp" "strings" ) @@ -11,10 +12,17 @@ import ( // control attributes. type URL url.URL +var escapeRegexp = regexp.MustCompile(`^(.+?)://(.*?)@(.*?)/(.*?)$`) + // ParseURL parses a RTSP URL. func ParseURL(s string) (*URL, error) { - s = strings.ReplaceAll(s, "%25", "%") - s = strings.ReplaceAll(s, "%", "%25") + // https://github.com/golang/go/issues/30611 + m := escapeRegexp.FindStringSubmatch(s) + if m != nil { + m[3] = strings.ReplaceAll(m[3], "%25", "%") + m[3] = strings.ReplaceAll(m[3], "%", "%25") + s = m[1] + "://" + m[2] + "@" + m[3] + "/" + m[4] + } u, err := url.Parse(s) if err != nil { diff --git a/pkg/base/url_test.go b/pkg/base/url_test.go index 930e3e43..4b5e8076 100644 --- a/pkg/base/url_test.go +++ b/pkg/base/url_test.go @@ -1,6 +1,7 @@ package base import ( + "net/url" "testing" "github.com/stretchr/testify/require" @@ -22,11 +23,12 @@ func TestURLParse(t *testing.T) { }{ { "ipv6 stateless", - `rtsp://[fe80::a8f4:3219:f33e:a072%wl0]:8554/proxied`, + `rtsp://user:pa%23ss@[fe80::a8f4:3219:f33e:a072%wl0]:8554/prox%23ied`, &URL{ Scheme: "rtsp", Host: "[fe80::a8f4:3219:f33e:a072%wl0]:8554", - Path: "/proxied", + Path: "/prox#ied", + User: url.UserPassword("user", "pa#ss"), }, }, } {