Skip to content

Commit 2627324

Browse files
authored
feat: add User-Agent header to ecosyste.ms API requests (#118)
Signed-off-by: Andrew Nesbitt <[email protected]>
1 parent 92b58cc commit 2627324

File tree

5 files changed

+99
-3
lines changed

5 files changed

+99
-3
lines changed

.goreleaser.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ builds:
2323
- "-s"
2424
- "-w"
2525
- "-X github.com/snyk/parlay/internal/commands.version={{.Version}}"
26+
- "-X github.com/snyk/parlay/lib/ecosystems.Version={{.Version}}"
2627

2728
archives:
2829
- format: tar.gz

lib/ecosystems/package.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package ecosystems
1919
import (
2020
"context"
2121
"fmt"
22+
"net/http"
2223

2324
"github.com/package-url/packageurl-go"
2425

@@ -27,8 +28,19 @@ import (
2728

2829
const server = "https://packages.ecosyste.ms/api/v1"
2930

31+
// Version will be set by the build process
32+
var Version = "dev"
33+
34+
func getUserAgent() string {
35+
return fmt.Sprintf("parlay (%s)", Version)
36+
}
37+
3038
func GetPackageData(purl packageurl.PackageURL) (*packages.GetRegistryPackageResponse, error) {
31-
client, err := packages.NewClientWithResponses(server)
39+
client, err := packages.NewClientWithResponses(server,
40+
packages.WithRequestEditorFn(func(ctx context.Context, req *http.Request) error {
41+
req.Header.Set("User-Agent", getUserAgent())
42+
return nil
43+
}))
3244
if err != nil {
3345
return nil, err
3446
}
@@ -44,7 +56,11 @@ func GetPackageData(purl packageurl.PackageURL) (*packages.GetRegistryPackageRes
4456
}
4557

4658
func GetPackageVersionData(purl packageurl.PackageURL) (*packages.GetRegistryPackageVersionResponse, error) {
47-
client, err := packages.NewClientWithResponses(server)
59+
client, err := packages.NewClientWithResponses(server,
60+
packages.WithRequestEditorFn(func(ctx context.Context, req *http.Request) error {
61+
req.Header.Set("User-Agent", getUserAgent())
62+
return nil
63+
}))
4864
if err != nil {
4965
return nil, err
5066
}

lib/ecosystems/package_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package ecosystems
1818

1919
import (
2020
"fmt"
21+
"net/http"
2122
"testing"
2223

2324
"github.com/jarcoal/httpmock"
@@ -47,6 +48,57 @@ func TestGetPackageData(t *testing.T) {
4748
assert.Equal(t, 1, calls[`GET =~^https://packages.ecosyste.ms/api/v1/registries`])
4849
}
4950

51+
func TestGetPackageDataUserAgent(t *testing.T) {
52+
httpmock.Activate()
53+
defer httpmock.DeactivateAndReset()
54+
55+
var capturedUserAgent string
56+
httpmock.RegisterResponder(
57+
"GET",
58+
`=~^https://packages.ecosyste.ms/api/v1/registries`,
59+
func(req *http.Request) (*http.Response, error) {
60+
capturedUserAgent = req.Header.Get("User-Agent")
61+
return httpmock.NewBytesResponse(200, []byte{}), nil
62+
},
63+
)
64+
65+
purl, err := packageurl.FromString("pkg:npm/[email protected]")
66+
require.NoError(t, err)
67+
68+
_, err = GetPackageData(purl)
69+
require.NoError(t, err)
70+
71+
expectedUserAgent := fmt.Sprintf("parlay (%s)", Version)
72+
assert.Equal(t, expectedUserAgent, capturedUserAgent)
73+
// Verify it contains "parlay" and the version in parentheses
74+
assert.Contains(t, capturedUserAgent, "parlay")
75+
assert.Contains(t, capturedUserAgent, "(")
76+
assert.Contains(t, capturedUserAgent, ")")
77+
}
78+
79+
func TestGetPackageVersionDataUserAgent(t *testing.T) {
80+
httpmock.Activate()
81+
defer httpmock.DeactivateAndReset()
82+
83+
var capturedUserAgent string
84+
httpmock.RegisterResponder(
85+
"GET",
86+
`=~^https://packages.ecosyste.ms/api/v1/registries`,
87+
func(req *http.Request) (*http.Response, error) {
88+
capturedUserAgent = req.Header.Get("User-Agent")
89+
return httpmock.NewBytesResponse(200, []byte{}), nil
90+
},
91+
)
92+
93+
purl, err := packageurl.FromString("pkg:npm/[email protected]")
94+
require.NoError(t, err)
95+
96+
_, err = GetPackageVersionData(purl)
97+
require.NoError(t, err)
98+
99+
assert.Equal(t, fmt.Sprintf("parlay (%s)", Version), capturedUserAgent)
100+
}
101+
50102
func TestPurlToEcosystemsRegistry(t *testing.T) {
51103
testCases := []struct {
52104
purlStr string

lib/ecosystems/repo.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,19 @@ package ecosystems
1818

1919
import (
2020
"context"
21+
"net/http"
2122

2223
"github.com/snyk/parlay/ecosystems/repos"
2324
)
2425

2526
const repos_server = "https://repos.ecosyste.ms/api/v1"
2627

2728
func GetRepoData(url string) (*repos.RepositoriesLookupResponse, error) {
28-
client, err := repos.NewClientWithResponses(repos_server)
29+
client, err := repos.NewClientWithResponses(repos_server,
30+
repos.WithRequestEditorFn(func(ctx context.Context, req *http.Request) error {
31+
req.Header.Set("User-Agent", getUserAgent())
32+
return nil
33+
}))
2934
if err != nil {
3035
return nil, err
3136
}

lib/ecosystems/repo_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package ecosystems
1818

1919
import (
20+
"fmt"
21+
"net/http"
2022
"testing"
2123

2224
"github.com/jarcoal/httpmock"
@@ -41,3 +43,23 @@ func TestGetRepoData(t *testing.T) {
4143
calls := httpmock.GetCallCountInfo()
4244
assert.Equal(t, 1, calls["GET https://repos.ecosyste.ms/api/v1/repositories/lookup"])
4345
}
46+
47+
func TestGetRepoDataUserAgent(t *testing.T) {
48+
httpmock.Activate()
49+
defer httpmock.DeactivateAndReset()
50+
51+
var capturedUserAgent string
52+
httpmock.RegisterResponder(
53+
"GET",
54+
"https://repos.ecosyste.ms/api/v1/repositories/lookup",
55+
func(req *http.Request) (*http.Response, error) {
56+
capturedUserAgent = req.Header.Get("User-Agent")
57+
return httpmock.NewBytesResponse(200, []byte{}), nil
58+
},
59+
)
60+
61+
_, err := GetRepoData("https://github.com/golang/go")
62+
require.NoError(t, err)
63+
64+
assert.Equal(t, fmt.Sprintf("parlay (%s)", Version), capturedUserAgent)
65+
}

0 commit comments

Comments
 (0)