include user agent

Amolith created

Change summary

cmd/cooked-mcp/main.go         |  2 +-
internal/cooked/client.go      | 11 +++++++----
internal/cooked/client_test.go | 24 +++++++++++++++++++++++-
3 files changed, 31 insertions(+), 6 deletions(-)

Detailed changes

cmd/cooked-mcp/main.go 🔗

@@ -74,7 +74,7 @@ func run() error {
 		return err
 	}
 
-	client, err := cooked.NewClient(config.BaseURL, config.Username, config.Password)
+	client, err := cooked.NewClient(config.BaseURL, config.Username, config.Password, "cooked-mcp/"+version)
 	if err != nil {
 		return err
 	}

internal/cooked/client.go 🔗

@@ -30,6 +30,7 @@ type Client struct {
 	username string
 	password string
 	http     *http.Client
+	userAgent string
 
 	requestMu             sync.Mutex
 	authenticatedUsername string
@@ -105,16 +106,17 @@ type RecipeURLImport struct {
 }
 
 // NewClient returns a Cooked client with an in-memory cookie jar.
-func NewClient(baseURL *url.URL, username, password string) (*Client, error) {
+func NewClient(baseURL *url.URL, username, password, userAgent string) (*Client, error) {
 	jar, err := newCookieJar()
 	if err != nil {
 		return nil, fmt.Errorf("create cookie jar: %w", err)
 	}
 
 	return &Client{
-		baseURL:  baseURL,
-		username: username,
-		password: password,
+		baseURL:   baseURL,
+		username:  username,
+		password:  password,
+		userAgent: userAgent,
 		http: &http.Client{
 			Jar:     jar,
 			Timeout: 30 * time.Second,
@@ -585,6 +587,7 @@ func (c *Client) newRequest(ctx context.Context, method, path string, body []byt
 	if body != nil {
 		request.Header.Set("Content-Type", "application/json")
 	}
+	request.Header.Set("User-Agent", c.userAgent)
 
 	return request, nil
 }

internal/cooked/client_test.go 🔗

@@ -389,6 +389,28 @@ func TestNewRequestPreservesEscapedUserPathWithQuery(t *testing.T) {
 	}
 }
 
+func TestNewRequestSetsUserAgent(t *testing.T) {
+	baseURL, err := url.Parse("https://example.invalid")
+	if err != nil {
+		t.Fatalf("parse base URL: %v", err)
+	}
+	client := &Client{baseURL: baseURL, userAgent: "cooked-mcp/test"}
+
+	request, err := client.newRequest(
+		context.Background(),
+		http.MethodGet,
+		"/api/public/login",
+		nil,
+	)
+	if err != nil {
+		t.Fatalf("newRequest() error = %v", err)
+	}
+
+	if got := request.Header.Get("User-Agent"); got != "cooked-mcp/test" {
+		t.Fatalf("User-Agent = %q, want %q", got, "cooked-mcp/test")
+	}
+}
+
 func newTestClient(t *testing.T, handler http.HandlerFunc) (*Client, func()) {
 	t.Helper()
 
@@ -398,7 +420,7 @@ func newTestClient(t *testing.T, handler http.HandlerFunc) (*Client, func()) {
 		server.Close()
 		t.Fatalf("parse server URL: %v", err)
 	}
-	client, err := NewClient(baseURL, "configured-user", "configured-password")
+	client, err := NewClient(baseURL, "configured-user", "configured-password", "cooked-mcp/test")
 	if err != nil {
 		server.Close()
 		t.Fatalf("NewClient() error = %v", err)