diff --git a/packages/toolkit/src/query/fetchBaseQuery.ts b/packages/toolkit/src/query/fetchBaseQuery.ts index 4e32e799e3..1127706392 100644 --- a/packages/toolkit/src/query/fetchBaseQuery.ts +++ b/packages/toolkit/src/query/fetchBaseQuery.ts @@ -110,7 +110,7 @@ export type FetchBaseQueryArgs = { BaseQueryApi, 'getState' | 'extra' | 'endpoint' | 'type' | 'forced' > - ) => MaybePromise + ) => MaybePromise fetchFn?: ( input: RequestInfo, init?: RequestInit | undefined @@ -224,10 +224,15 @@ export function fetchBaseQuery({ ...rest, } - config.headers = await prepareHeaders( - new Headers(stripUndefined(headers)), - { getState, extra, endpoint, forced, type } - ) + headers = new Headers(stripUndefined(headers)) + config.headers = + (await prepareHeaders(headers, { + getState, + extra, + endpoint, + forced, + type, + })) || headers // Only set the content-type to json if appropriate. Will not be true for FormData, ArrayBuffer, Blob, etc. const isJsonifiable = (body: any) => diff --git a/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx b/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx index 55f9ec6e6b..e6d7540f80 100644 --- a/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx +++ b/packages/toolkit/src/query/tests/fetchBaseQuery.test.tsx @@ -657,6 +657,26 @@ describe('fetchBaseQuery', () => { expect(request.headers['delete2']).toBeUndefined() }) + test('prepareHeaders can return undefined', async () => { + let request: any + + const token = 'accessToken' + + const _baseQuery = fetchBaseQuery({ + baseUrl, + prepareHeaders: (headers) => { + headers.set('authorization', `Bearer ${token}`) + }, + }) + + const doRequest = async () => + _baseQuery({ url: '/echo' }, commonBaseQueryApi, {}) + + ;({ data: request } = await doRequest()) + + expect(request.headers['authorization']).toBe(`Bearer ${token}`) + }) + test('prepareHeaders is able to be an async function', async () => { let request: any @@ -679,6 +699,27 @@ describe('fetchBaseQuery', () => { expect(request.headers['authorization']).toBe(`Bearer ${token}`) }) + test('prepareHeaders is able to be an async function returning undefined', async () => { + let request: any + + const token = 'accessToken' + const getAccessTokenAsync = async () => token + + const _baseQuery = fetchBaseQuery({ + baseUrl, + prepareHeaders: async (headers) => { + headers.set('authorization', `Bearer ${await getAccessTokenAsync()}`) + }, + }) + + const doRequest = async () => + _baseQuery({ url: '/echo' }, commonBaseQueryApi, {}) + + ;({ data: request } = await doRequest()) + + expect(request.headers['authorization']).toBe(`Bearer ${token}`) + }) + test('prepareHeaders is able to select from a state', async () => { let request: any