✨ Added urlutil package with ShiftPath helper
This commit is contained in:
parent
f02bde306d
commit
834af5d3cf
22
internal/urlutil/shift_path.go
Normal file
22
internal/urlutil/shift_path.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
package urlutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ShiftPath splits off the first component of p, which will be cleaned of
|
||||||
|
// relative components before processing. head will never contain a slash and
|
||||||
|
// tail will always be a rooted path without trailing slash.
|
||||||
|
//
|
||||||
|
// See: https://blog.merovius.de/posts/2017-06-18-how-not-to-use-an-http-router/
|
||||||
|
func ShiftPath(p string) (head, tail string) {
|
||||||
|
p = path.Clean("/" + p)
|
||||||
|
|
||||||
|
i := strings.Index(p[1:], "/") + 1
|
||||||
|
if i <= 0 {
|
||||||
|
return p[1:], "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
return p[1:i], p[i:]
|
||||||
|
}
|
31
internal/urlutil/shift_path_test.go
Normal file
31
internal/urlutil/shift_path_test.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package urlutil_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"source.toby3d.me/toby3d/auth/internal/urlutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestShiftPath(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
for in, out := range map[string][2]string{
|
||||||
|
"/": {"", "/"},
|
||||||
|
"/foo": {"foo", "/"},
|
||||||
|
"/foo/": {"foo", "/"},
|
||||||
|
"/foo/bar": {"foo", "/bar"},
|
||||||
|
"/foo/bar/": {"foo", "/bar"},
|
||||||
|
} {
|
||||||
|
in, out := in, out
|
||||||
|
|
||||||
|
t.Run(in, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
head, path := urlutil.ShiftPath(in)
|
||||||
|
|
||||||
|
if out[0] != head || out[1] != path {
|
||||||
|
t.Errorf("ShiftPath(%s) = '%s', '%s', want '%s', '%s'", in, head, path, out[0], out[1])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user