[shared] allow setting a user agent for the rest client (#5037)

This commit is contained in:
Pascal Fischer
2026-01-06 10:52:36 +01:00
committed by GitHub
parent 7bb4fc3450
commit f022e34287
3 changed files with 62 additions and 0 deletions

View File

@@ -16,6 +16,7 @@ type Client struct {
managementURL string managementURL string
authHeader string authHeader string
httpClient HttpClient httpClient HttpClient
userAgent string
// Accounts NetBird account APIs // Accounts NetBird account APIs
// see more: https://docs.netbird.io/api/resources/accounts // see more: https://docs.netbird.io/api/resources/accounts
@@ -128,6 +129,9 @@ func (c *Client) NewRequest(ctx context.Context, method, path string, body io.Re
if body != nil { if body != nil {
req.Header.Add("Content-Type", "application/json") req.Header.Add("Content-Type", "application/json")
} }
if c.userAgent != "" {
req.Header.Set("User-Agent", c.userAgent)
}
if len(query) != 0 { if len(query) != 0 {
q := req.URL.Query() q := req.URL.Query()

View File

@@ -4,10 +4,14 @@
package rest_test package rest_test
import ( import (
"context"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/netbirdio/netbird/management/server/http/testing/testing_tools/channel" "github.com/netbirdio/netbird/management/server/http/testing/testing_tools/channel"
"github.com/netbirdio/netbird/shared/management/client/rest" "github.com/netbirdio/netbird/shared/management/client/rest"
) )
@@ -32,3 +36,50 @@ func withBlackBoxServer(t *testing.T, callback func(*rest.Client)) {
c := rest.New(server.URL, "nbp_apTmlmUXHSC4PKmHwtIZNaGr8eqcVI2gMURp") c := rest.New(server.URL, "nbp_apTmlmUXHSC4PKmHwtIZNaGr8eqcVI2gMURp")
callback(c) callback(c)
} }
func TestClient_UserAgent_Set(t *testing.T) {
expectedUserAgent := "TestApp/1.2.3"
mux := &http.ServeMux{}
server := httptest.NewServer(mux)
defer server.Close()
mux.HandleFunc("/api/accounts", func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, expectedUserAgent, r.Header.Get("User-Agent"))
w.WriteHeader(200)
_, err := w.Write([]byte("[]"))
require.NoError(t, err)
})
c := rest.NewWithOptions(
rest.WithManagementURL(server.URL),
rest.WithPAT("test-token"),
rest.WithUserAgent(expectedUserAgent),
)
_, err := c.Accounts.List(context.Background())
require.NoError(t, err)
}
func TestClient_UserAgent_NotSet(t *testing.T) {
mux := &http.ServeMux{}
server := httptest.NewServer(mux)
defer server.Close()
mux.HandleFunc("/api/accounts", func(w http.ResponseWriter, r *http.Request) {
// When no custom user agent is set, Go's default HTTP client will set one
// We just verify that the header exists (it will be Go's default)
userAgent := r.Header.Get("User-Agent")
assert.NotEmpty(t, userAgent)
w.WriteHeader(200)
_, err := w.Write([]byte("[]"))
require.NoError(t, err)
})
c := rest.NewWithOptions(
rest.WithManagementURL(server.URL),
rest.WithPAT("test-token"),
)
_, err := c.Accounts.List(context.Background())
require.NoError(t, err)
}

View File

@@ -42,3 +42,10 @@ func WithAuthHeader(value string) option {
c.authHeader = value c.authHeader = value
} }
} }
// WithUserAgent sets a custom User-Agent header for HTTP requests
func WithUserAgent(userAgent string) option {
return func(c *Client) {
c.userAgent = userAgent
}
}