Skip to content

Commit

Permalink
Add includeRequestInErrorResponse to HttpMiddlewareOptions (#248)
Browse files Browse the repository at this point in the history
* feat(http-middleware): add excludeRequestInErrorResponse

- add an option () to exclude original request from error responses.
- add test to validate functionality
- add changeset to track changes

* chore(changeset): update changeset

- update changeset to reflect new options name
  • Loading branch information
ajimae committed Apr 25, 2022
1 parent c1dad45 commit 7512c3f
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/small-numbers-peel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@commercetools/sdk-client-v2': patch
---

- add an option (`includeRequestInErrorResponse`) to include or exclude original request from error responses.
9 changes: 7 additions & 2 deletions packages/sdk-client/src/sdk-middleware-http/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ export default function createHttpMiddleware({
credentialsMode,
includeResponseHeaders,
includeOriginalRequest,
includeRequestInErrorResponse = true,
maskSensitiveHeaderData = true,
enableRetry,
timeout,
Expand Down Expand Up @@ -244,7 +245,9 @@ export default function createHttpMiddleware({

const error: HttpErrorType = createError({
statusCode: res.status,
originalRequest: request,
...(includeRequestInErrorResponse
? { originalRequest: request }
: {}),
retryCount,
headers: parseHeaders(res.headers),
...(typeof parsed === 'object'
Expand Down Expand Up @@ -302,7 +305,9 @@ export default function createHttpMiddleware({
}

const error = new NetworkError(e.message, {
originalRequest: request,
...(includeRequestInErrorResponse
? { originalRequest: request }
: {}),
retryCount,
})
maskAuthData(error.originalRequest, maskSensitiveHeaderData)
Expand Down
1 change: 1 addition & 0 deletions packages/sdk-client/src/types/sdk.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ export type HttpMiddlewareOptions = {
includeHeaders?: boolean
includeResponseHeaders?: boolean
includeOriginalRequest?: boolean
includeRequestInErrorResponse?: boolean
maskSensitiveHeaderData?: boolean
timeout?: number
enableRetry?: boolean
Expand Down
89 changes: 89 additions & 0 deletions packages/sdk-client/test/http.test/http.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,95 @@ describe('Http', () => {
httpMiddleware(next)(request, response)
}))

test('should not `include original request` in error response', () =>
new Promise((resolve: Function, reject: Function) => {
const request = createTestRequest({
uri: '/foo/bar',
})
const response = { resolve: Function, reject: Function } as any
const next = (req: MiddlewareRequest, res: MiddlewareResponse) => {
expect(res.error.name).toBe('NetworkError')
expect(res.error.headers).toBeUndefined()
expect(res.error.originalRequest).toBeUndefined()
expect(res.error.message).toBe(
`request to ${testHost}/foo/bar failed, reason: Connection timeout`
)
expect(res.body).toBeUndefined()
expect(res.statusCode).toBe(0)
resolve()
}
const httpMiddleware = createHttpMiddleware({
host: testHost,
includeRequestInErrorResponse: false,
fetch,
} as any)
nock(testHost)
.defaultReplyHeaders({
'Content-Type': 'application/json',
})
.get('/foo/bar')
.replyWithError('Connection timeout')

httpMiddleware(next)(request, response)
}))

test('should `include original request` in error response', () =>
new Promise((resolve: Function, reject: Function) => {
const request = createTestRequest({
uri: '/foo/bar',
})
const response = { resolve: Function, reject: Function } as any
const next = (req: MiddlewareRequest, res: MiddlewareResponse) => {
expect(res.error.name).toBe('NetworkError')
expect(res.error.headers).toBeUndefined()
expect(res.error.originalRequest).toBeDefined()
expect(res.error.message).toBe(
`request to ${testHost}/foo/bar failed, reason: Connection timeout`
)
expect(res.body).toBeUndefined()
expect(res.statusCode).toBe(0)
resolve()
}
const httpMiddleware = createHttpMiddleware({
host: testHost,
includeRequestInErrorResponse: true,
fetch,
} as any)
nock(testHost)
.defaultReplyHeaders({
'Content-Type': 'application/json',
})
.get('/foo/bar')
.replyWithError('Connection timeout')

httpMiddleware(next)(request, response)
}))

test('should not `include original request` in (5xx) error response', () =>
new Promise((resolve: Function, reject: Function) => {
const request = createTestRequest({
uri: '/foo/bar',
})
const response = { resolve: Function, reject: Function } as any
const next = (req: MiddlewareRequest, res: MiddlewareResponse) => {
expect(res.error.name).toBe('HttpError')
expect(res.error.originalRequest).toBeUndefined()
expect(res.statusCode).toBe(502)
expect(res.body).toBeUndefined()
resolve()
}
const options = {
host: testHost,
enableRetry: true,
includeRequestInErrorResponse: false,
fetch,
} as any
const httpMiddleware = createHttpMiddleware(options)
nock(testHost).get('/foo/bar').reply(502)

httpMiddleware(next)(request, response)
}))

test('execute a post request (success)', () =>
new Promise((resolve: Function, reject: Function) => {
const request = createTestRequest({
Expand Down

0 comments on commit 7512c3f

Please sign in to comment.