Skip to content

Commit 6d755e8

Browse files
authoredApr 13, 2022
Merge pull request #22 from planetlabs/urls
Retain double slashes when creating absolute URLs
2 parents 9fcbdd4 + b8c540c commit 6d755e8

File tree

3 files changed

+93
-6
lines changed

3 files changed

+93
-6
lines changed
 

‎.github/workflows/test.yml

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ jobs:
1717
- uses: golangci/golangci-lint-action@v2
1818
with:
1919
version: v1.45.2
20+
args: "--out-${NO_FUTURE}format colored-line-number"
2021

2122
test:
2223
runs-on: ubuntu-latest

‎cmd/stac/make-links-absolute.go

+23-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"net/url"
78
"os"
89
"path"
910
"path/filepath"
@@ -60,8 +61,11 @@ var absoluteLinksCommand = &cli.Command{
6061
if entryUrl == "" {
6162
return fmt.Errorf("missing --%s", flagUrl)
6263
}
63-
64-
baseUrl := path.Dir(entryUrl)
64+
baseUrl, urlErr := url.Parse(entryUrl)
65+
if urlErr != nil {
66+
return fmt.Errorf("trouble parsing url %q: %w", entryUrl, urlErr)
67+
}
68+
baseUrl.Path = path.Dir(baseUrl.Path)
6569

6670
outputPath := ctx.String(flagOutput)
6771
if outputPath == "" {
@@ -76,7 +80,12 @@ var absoluteLinksCommand = &cli.Command{
7680

7781
links := resource.Links()
7882
for _, link := range links {
79-
link["href"] = makeAbsolute(link["href"], filepath.ToSlash(relDir), baseUrl)
83+
relUrl, err := url.Parse(link["href"])
84+
if err != nil {
85+
return fmt.Errorf("failed to parse link %q: %w", link["href"], err)
86+
}
87+
absUrl := makeAbsolute(relUrl, filepath.ToSlash(relDir), baseUrl)
88+
link["href"] = absUrl.String()
8089
}
8190
resource["links"] = links
8291

@@ -106,10 +115,18 @@ var absoluteLinksCommand = &cli.Command{
106115
},
107116
}
108117

109-
func makeAbsolute(linkUrl string, resourceDir string, baseUrl string) string {
110-
if strings.HasPrefix(linkUrl, baseUrl+"/") {
118+
func cloneUrl(u *url.URL) *url.URL {
119+
newUrl := *u
120+
return &newUrl
121+
}
122+
123+
func makeAbsolute(linkUrl *url.URL, resourceDir string, baseUrl *url.URL) *url.URL {
124+
if linkUrl.IsAbs() {
111125
return linkUrl
112126
}
113127

114-
return path.Join(baseUrl, path.Join(resourceDir, linkUrl))
128+
newUrl := cloneUrl(baseUrl)
129+
newUrl.Path = path.Join(baseUrl.Path, path.Join(resourceDir, linkUrl.Path))
130+
131+
return newUrl
115132
}

‎cmd/stac/make-links-absolute_test.go

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"net/url"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestMakeAbsoluteUrl(t *testing.T) {
13+
cases := []struct {
14+
dir string
15+
link string
16+
base string
17+
abs string
18+
}{
19+
{
20+
dir: "some/dir",
21+
link: "./item.json",
22+
base: "https://example.com/stac",
23+
abs: "https://example.com/stac/some/dir/item.json",
24+
},
25+
{
26+
dir: "some/dir",
27+
link: "item.json",
28+
base: "https://example.com/stac",
29+
abs: "https://example.com/stac/some/dir/item.json",
30+
},
31+
{
32+
dir: "some/dir",
33+
link: "../../catalog.json",
34+
base: "https://example.com/stac",
35+
abs: "https://example.com/stac/catalog.json",
36+
},
37+
{
38+
dir: "some/dir",
39+
link: "../../../../../../catalog.json",
40+
base: "https://example.com/stac",
41+
abs: "https://example.com/catalog.json",
42+
},
43+
{
44+
dir: "../some/dir",
45+
link: "other/catalog.json",
46+
base: "https://example.com/stac",
47+
abs: "https://example.com/some/dir/other/catalog.json",
48+
},
49+
{
50+
dir: "some-dir",
51+
link: "https://example.com/some-dir/item.json",
52+
base: "https://other.com/stac",
53+
abs: "https://example.com/some-dir/item.json",
54+
},
55+
}
56+
57+
for i, c := range cases {
58+
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
59+
linkUrl, err := url.Parse(c.link)
60+
require.NoError(t, err)
61+
62+
baseUrl, err := url.Parse(c.base)
63+
require.NoError(t, err)
64+
65+
absUrl := makeAbsolute(linkUrl, c.dir, baseUrl)
66+
assert.Equal(t, c.abs, absUrl.String())
67+
})
68+
}
69+
}

0 commit comments

Comments
 (0)