Skip to content

Commit

Permalink
pkg/nar: add support for URL query (#101)
Browse files Browse the repository at this point in the history
Revert "revert fix for query in url"

This reverts commit 0d6a95b.

add the support now
  • Loading branch information
kalbasit authored Dec 13, 2024
1 parent 757017e commit 29da605
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 4 deletions.
22 changes: 19 additions & 3 deletions pkg/nar/url.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ var (
// ErrInvalidURL is returned if the regexp did not match the given URL.
ErrInvalidURL = errors.New("invalid nar URL")

narRegexp = regexp.MustCompile(`^nar/([a-z0-9]+)\.nar(?:\.([a-z0-9]+))?$`)
// https://regex101.com/r/yPwxpw/2
narRegexp = regexp.MustCompile(`^nar/([a-z0-9]+)\.nar(\.([a-z0-9]+))?(\?([a-z0-9=&]*))?$`)
)

// URL represents a nar URL.
type URL struct {
Hash string
Compression string
Query url.Values
}

// ParseURL parses a nar URL (as present in narinfo) and returns its components.
Expand All @@ -33,12 +35,17 @@ func ParseURL(u string) (URL, error) {
}

sm := narRegexp.FindStringSubmatch(u)
if len(sm) != 3 {
if len(sm) != 6 {
return nu, ErrInvalidURL
}

nu.Hash = sm[1]
nu.Compression = sm[2]
nu.Compression = sm[3]

var err error
if nu.Query, err = url.ParseQuery(sm[5]); err != nil {
return nu, err
}

return nu, nil
}
Expand All @@ -48,6 +55,7 @@ func (u URL) NewLogger(log log15.Logger) log15.Logger {
return log.New(
"hash", u.Hash,
"compression", u.Compression,
"query", u.Query.Encode(),
)
}

Expand All @@ -67,5 +75,13 @@ func (u URL) JoinURL(uri *url.URL) *url.URL {

uri = uri.JoinPath(p)

if q := u.Query.Encode(); q != "" {
if uri.RawQuery != "" {
uri.RawQuery += "&"
}

uri.RawQuery += q
}

return uri
}
30 changes: 29 additions & 1 deletion pkg/nar/url_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func TestParseURL(t *testing.T) {
narURL: nar.URL{
Hash: "1mb5fxh7nzbx1b2q40bgzwjnjh8xqfap9mfnfqxlvvgvdyv8xwps",
Compression: "",
Query: url.Values{},
},
err: nil,
},
Expand All @@ -38,6 +39,25 @@ func TestParseURL(t *testing.T) {
narURL: nar.URL{
Hash: "1mb5fxh7nzbx1b2q40bgzwjnjh8xqfap9mfnfqxlvvgvdyv8xwps",
Compression: "xz",
Query: url.Values{},
},
err: nil,
},
{
url: "nar/1bn7c3bf5z32cdgylhbp9nzhh6ydib5ngsm6mdhsvf233g0nh1ac.nar?hash=1q8w6gl1ll0mwfkqc3c2yx005s6wwfrl",
narURL: nar.URL{
Hash: "1bn7c3bf5z32cdgylhbp9nzhh6ydib5ngsm6mdhsvf233g0nh1ac",
Compression: "",
Query: url.Values(map[string][]string{"hash": {"1q8w6gl1ll0mwfkqc3c2yx005s6wwfrl"}}),
},
err: nil,
},
{
url: "nar/1bn7c3bf5z32cdgylhbp9nzhh6ydib5ngsm6mdhsvf233g0nh1ac.nar.xz?hash=1q8w6gl1ll0mwfkqc3c2yx005s6wwfrl",
narURL: nar.URL{
Hash: "1bn7c3bf5z32cdgylhbp9nzhh6ydib5ngsm6mdhsvf233g0nh1ac",
Compression: "xz",
Query: url.Values(map[string][]string{"hash": {"1q8w6gl1ll0mwfkqc3c2yx005s6wwfrl"}}),
},
err: nil,
},
Expand Down Expand Up @@ -65,23 +85,31 @@ func TestJoinURL(t *testing.T) {
hash string
compression string
url string
query string
}{
{hash: "", compression: "", url: "http://example.com/nar/.nar"}, // not really valid but it is what it is
{hash: "abc123", compression: "", url: "http://example.com/nar/abc123.nar"},
{hash: "def456", compression: "xz", url: "http://example.com/nar/def456.nar.xz"},

{hash: "abc123", compression: "", query: "hash=123", url: "http://example.com/nar/abc123.nar?hash=123"},
{hash: "def456", compression: "xz", query: "hash=123", url: "http://example.com/nar/def456.nar.xz?hash=123"},
}

for _, test := range tests {
tname := fmt.Sprintf("URL(%q, %q).ToFilePath() -> %q", test.hash, test.compression, test.url)
tname := fmt.Sprintf("URL(%q, %q, %q).ToFilePath() -> %q", test.hash, test.compression, test.query, test.url)
t.Run(tname, func(t *testing.T) {
t.Parallel()

u, err := url.Parse("http://example.com")
require.NoError(t, err)

q, err := url.ParseQuery(test.query)
require.NoError(t, err)

nu := nar.URL{
Hash: test.hash,
Compression: test.compression,
Query: q,
}

assert.Equal(t, test.url, nu.JoinURL(u).String())
Expand Down

0 comments on commit 29da605

Please sign in to comment.