From 58aa8126ea72eff39ff31fea5d003fa58a564483 Mon Sep 17 00:00:00 2001 From: Phoebe Szmucer Date: Mon, 17 Feb 2025 15:55:37 +0000 Subject: [PATCH 1/2] Conjure User-Agents supports arbitrary comment data --- .../conjure-client/src/__integTest__/tests.ts | 1 + .../__tests__/fetchBridgeServerTests.ts | 2 +- .../fetchBridge/__tests__/fetchBridgeTests.ts | 26 +++++++++++++++++++ packages/conjure-client/src/userAgent.ts | 20 ++++++++++++-- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/packages/conjure-client/src/__integTest__/tests.ts b/packages/conjure-client/src/__integTest__/tests.ts index f8e6ae02..a23cf30b 100644 --- a/packages/conjure-client/src/__integTest__/tests.ts +++ b/packages/conjure-client/src/__integTest__/tests.ts @@ -44,6 +44,7 @@ const bridge = new FetchBridge({ userAgent: { productName: "conjure-typescript-runtime", productVersion: "0.0.0", + comments: ["some-comment"], }, }); diff --git a/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeServerTests.ts b/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeServerTests.ts index 879b5fa3..24552e86 100644 --- a/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeServerTests.ts +++ b/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeServerTests.ts @@ -36,7 +36,7 @@ describe("FetchBridgeImplServer", () => { const host = "localhost"; const port = 9000; const baseUrl = `http://${host}:${port}`; - const userAgent: IUserAgent = { productName: "foo", productVersion: "1.2.3" }; + const userAgent: IUserAgent = { productName: "foo", productVersion: "1.2.3", comments: ["some-comment"] }; bridge = new FetchBridge({ baseUrl, token, fetch: nodeFetchStreamAdapter(nodeFetch), userAgent }); app = express(); diff --git a/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeTests.ts b/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeTests.ts index aa9bc08c..93e5e63d 100644 --- a/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeTests.ts +++ b/packages/conjure-client/src/fetchBridge/__tests__/fetchBridgeTests.ts @@ -563,6 +563,32 @@ describe("FetchBridgeImpl", () => { verifyFetchUserAgent(`foo/1.2.3 bar/1.2.3 baz/1.2.3 conjure-typescript-runtime/${IMPLEMENTATION_VERSION}`); }); + it("for a user agent with comments", async () => { + const fetchBridge = new FetchBridge({ + baseUrl, + token, + fetch: undefined, + userAgent: { productName: "foo", productVersion: "1.2.3", comments: ["comment1", "comment2"] }, + }); + + await fetchBridge.callEndpoint(request); + + verifyFetchUserAgent(`foo/1.2.3 (comment1; comment2) conjure-typescript-runtime/${IMPLEMENTATION_VERSION}`); + }); + + it("for a user agent with empty coments", async () => { + const fetchBridge = new FetchBridge({ + baseUrl, + token, + fetch: undefined, + userAgent: { productName: "foo", productVersion: "1.2.3", comments: [] }, + }); + + await fetchBridge.callEndpoint(request); + + verifyFetchUserAgent(`foo/1.2.3 conjure-typescript-runtime/${IMPLEMENTATION_VERSION}`); + }); + it("for changing user agent", async () => { const userAgentSupplier = jest .fn() diff --git a/packages/conjure-client/src/userAgent.ts b/packages/conjure-client/src/userAgent.ts index e6fa7fe1..eab75ede 100644 --- a/packages/conjure-client/src/userAgent.ts +++ b/packages/conjure-client/src/userAgent.ts @@ -18,6 +18,18 @@ export interface IUserAgent { productName: string; productVersion: string; + /** + * [rfc7231 section-5.5.3](https://datatracker.ietf.org/doc/html/rfc7231#section-5.5.3) comment + * metadata (as described by + * [rfc7230 section-3.2.6](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.6")) + * for additional diagnostic information. + * + * Note that this library provides a much stricter set of allowed + * characters within comments than the linked RFCs to reduce complexity. + * + * Allowed characters: "a-zA-Z0-9.-:_/ " + */ + comments?: string[]; } /** @@ -40,6 +52,10 @@ export class UserAgent { } function formatUserAgent(userAgent: IUserAgent): string { - const { productName, productVersion } = userAgent; - return `${productName}/${productVersion}`; + const { productName, productVersion, comments } = userAgent; + let formattedUserAgent = `${productName}/${productVersion}`; + if (comments != null && comments.length > 0) { + formattedUserAgent += " (" + comments.join("; ") + ")"; + } + return formattedUserAgent; } From 30cd2b210b8b23965f16e2215523e5026d23af5b Mon Sep 17 00:00:00 2001 From: svc-changelog Date: Tue, 18 Feb 2025 13:58:00 +0000 Subject: [PATCH 2/2] Add generated changelog entries --- packages/conjure-client/changelog/@unreleased/pr-186.v2.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/conjure-client/changelog/@unreleased/pr-186.v2.yml diff --git a/packages/conjure-client/changelog/@unreleased/pr-186.v2.yml b/packages/conjure-client/changelog/@unreleased/pr-186.v2.yml new file mode 100644 index 00000000..004f1737 --- /dev/null +++ b/packages/conjure-client/changelog/@unreleased/pr-186.v2.yml @@ -0,0 +1,5 @@ +type: feature +feature: + description: Conjure User-Agents supports arbitrary comment data + links: + - https://github.com/palantir/conjure-typescript-runtime/pull/186