Skip to content

Commit 62003c5

Browse files
committed
Allow client option for custom dispatcher into fetch requests (e.g. to disable certificate validation) #1631
1 parent 9c51678 commit 62003c5

File tree

5 files changed

+44
-1
lines changed

5 files changed

+44
-1
lines changed

packages/openapi-fetch/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
"openapi-typescript-codegen": "^0.25.0",
7878
"openapi-typescript-fetch": "^2.0.0",
7979
"superagent": "^9.0.2",
80+
"undici": "^6.14.1",
8081
"typescript": "^5.4.5",
8182
"vite": "^5.3.5"
8283
}

packages/openapi-fetch/src/index.d.ts

+4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import type {
1010
SuccessResponse,
1111
} from "openapi-typescript-helpers";
1212

13+
import type { Dispatcher } from "undici";
14+
1315
/** Options for each client instance */
1416
export interface ClientOptions extends Omit<RequestInit, "headers"> {
1517
/** set the common root URL for all API requests */
1618
baseUrl?: string;
19+
/** custom dispatcher */
20+
dispatcher?: Dispatcher;
1721
/** custom fetch (defaults to globalThis.fetch) */
1822
fetch?: (input: Request) => Promise<Response>;
1923
/** global querySerializer */

packages/openapi-fetch/src/index.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export function randomID() {
3434
export default function createClient(clientOptions) {
3535
let {
3636
baseUrl = "",
37+
dispatcher = undefined,
3738
fetch: baseFetch = globalThis.fetch,
3839
querySerializer: globalQuerySerializer,
3940
bodySerializer: globalBodySerializer,
@@ -125,7 +126,7 @@ export default function createClient(clientOptions) {
125126
}
126127

127128
// fetch!
128-
let response = await fetch(request);
129+
let response = await fetch(request, dispatcher ? { dispatcher } : undefined);
129130

130131
// middleware (response)
131132
// execute in reverse-array order (first priority gets last transform)

packages/openapi-fetch/test/index.test.ts

+28
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import createClient, {
88
} from "../src/index.js";
99
import { server, baseUrl, useMockRequestHandler, toAbsoluteURL } from "./fixtures/mock-server.js";
1010
import type { paths } from "./fixtures/api.js";
11+
import { Agent } from "undici";
1112

1213
beforeAll(() => {
1314
server.listen({
@@ -768,6 +769,33 @@ describe("client", () => {
768769
expect(getRequestUrl().href).toBe(toAbsoluteURL("/self"));
769770
});
770771

772+
it("dispatcher", async () => {
773+
const dispatcher = new Agent({
774+
connect: {
775+
rejectUnauthorized: false,
776+
},
777+
});
778+
let client = createClient<paths>({ baseUrl, dispatcher });
779+
780+
const { getRequestUrl } = useMockRequestHandler({
781+
baseUrl,
782+
method: "get",
783+
path: "/self",
784+
status: 200,
785+
body: { message: "OK" },
786+
});
787+
788+
await client.GET("/self");
789+
790+
// assert baseUrl and path mesh as expected
791+
expect(getRequestUrl().href).toBe(toAbsoluteURL("/self"));
792+
793+
client = createClient<paths>({ baseUrl });
794+
await client.GET("/self");
795+
// assert trailing '/' was removed
796+
expect(getRequestUrl().href).toBe(toAbsoluteURL("/self"));
797+
});
798+
771799
describe("headers", () => {
772800
it("persist", async () => {
773801
const headers: HeadersInit = { Authorization: "Bearer secrettoken" };

pnpm-lock.yaml

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)