diff --git a/encoding/token/token_test.go b/encoding/token/token_test.go index ad0df144..da0843d6 100644 --- a/encoding/token/token_test.go +++ b/encoding/token/token_test.go @@ -30,7 +30,9 @@ func TestUnmarshal(t *testing.T) { {":xxx", "", "xxx"}, {"foo:xxx", "foo", "xxx"}, {"foo::bar:xxx", "foo:bar", "xxx"}, + {"foo:::bar:xxx", "foo:", "bar:xxx"}, {"foo::::bar:xxx", "foo::bar", "xxx"}, + {"foo-bar:%26%21%27", "foo-bar", "%26%21%27"}, } for _, d := range data { diff --git a/rtmp/rtmp.go b/rtmp/rtmp.go index 4202a9c3..5d80d22e 100644 --- a/rtmp/rtmp.go +++ b/rtmp/rtmp.go @@ -220,8 +220,21 @@ func GetToken(u *url.URL) (string, string) { return u.Path, "" } + rawPath := "/" + strings.Join(pathElements[:nPathElements-1], "/") + rawToken := pathElements[nPathElements-1] + + path, err := url.PathUnescape(rawPath) + if err != nil { + path = rawPath + } + + token, err := url.PathUnescape(rawToken) + if err != nil { + token = rawToken + } + // Return the path without the token - return "/" + strings.Join(pathElements[:nPathElements-1], "/"), pathElements[nPathElements-1] + return path, token } func splitPath(path string) []string { diff --git a/rtmp/rtmp_test.go b/rtmp/rtmp_test.go index ec372690..f407fa5c 100644 --- a/rtmp/rtmp_test.go +++ b/rtmp/rtmp_test.go @@ -12,6 +12,8 @@ func TestToken(t *testing.T) { {"/foo/bar", "/foo", "bar"}, {"/foo/bar?token=abc", "/foo/bar", "abc"}, {"/foo/bar/abc", "/foo/bar", "abc"}, + {"/foo/bar/&!'", "/foo/bar", "&!'"}, + {"/foo/bar/%26%21%27", "/foo/bar", "&!'"}, } for _, d := range data {