diff --git a/transform/transform.go b/transform/transform.go index d3dc7d0..0ea3253 100644 --- a/transform/transform.go +++ b/transform/transform.go @@ -41,3 +41,31 @@ func ShuffleURLParameters(request string) string { return p.String() } + +// A path join that chooses its separator based on what is already present in the given parts rather +// than what OS it is currently running under. +func UniversalPathJoin(parts ...string) string { + if len(parts) == 0 { + return "" + } + + sep := "/" + for _, p := range parts { + if strings.Contains(p, "\\") { + sep = "\\" + + break + } + } + + for i, p := range parts { + if i == 0 { + // keep the root + parts[i] = strings.TrimRight(p, "/\\") + continue + } + parts[i] = strings.Trim(p, "/\\") + } + + return strings.Join(parts, sep) +} diff --git a/transform/transform_test.go b/transform/transform_test.go index 7799553..6d66094 100644 --- a/transform/transform_test.go +++ b/transform/transform_test.go @@ -59,3 +59,19 @@ func TestShuffleParametersInvalid(t *testing.T) { t.Fatal("Invalid URL should be empty", s) } } + +func TestUniversalPathJoin(t *testing.T) { + // unix check + want := "/apples/and/potatoes" + got := UniversalPathJoin("/apples/and", "potatoes") + if got != want { + t.Fatalf("Incorrect path recieved: wanted: %s, got: %s", want, got) + } + + // windows check + want = "C:\\thanks\\for\\fish" + got = UniversalPathJoin("C:\\thanks\\for", "fish") + if got != want { + t.Fatalf("Incorrect path recieved: wanted: %s, got: %s", want, got) + } +}