From 94799e1b1627e3f2c3c9500214d311fed44cdb1d Mon Sep 17 00:00:00 2001 From: lobsterjerusalem Date: Fri, 17 Apr 2026 10:47:07 -0600 Subject: [PATCH] added universal path join --- transform/transform.go | 28 ++++++++++++++++++++++++++++ transform/transform_test.go | 16 ++++++++++++++++ 2 files changed, 44 insertions(+) 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) + } +}