Skip to content

Commit 7f6e1fb

Browse files
SK-1904 add errorFromClient in error details (#190)
1 parent bd20baa commit 7f6e1fb

2 files changed

Lines changed: 95 additions & 11 deletions

File tree

‎src/vault/client/index.ts‎

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,36 +116,56 @@ class VaultClient {
116116
const data = err.response?.data;
117117
const requestId = err.response?.headers['x-request-id'];
118118

119+
const errorFromClientHeader = err.response?.headers?.['error-from-client'];
120+
const errorFromClient = errorFromClientHeader ? String(errorFromClientHeader).toLowerCase() === 'true' : undefined;
121+
119122
if (contentType) {
120123
if (contentType.includes('application/json')) {
121-
this.handleJsonError(err, data, requestId, reject);
124+
this.handleJsonError(err, data, requestId, reject, errorFromClient);
122125
} else if (contentType.includes('text/plain')) {
123-
this.handleTextError(err, data, requestId, reject);
126+
this.handleTextError(err, data, requestId, reject, errorFromClient);
124127
} else {
125-
this.handleGenericError(err, requestId, reject);
128+
this.handleGenericError(err, requestId, reject, errorFromClient);
126129
}
127130
} else {
128-
this.handleGenericError(err, requestId, reject);
131+
this.handleGenericError(err, requestId, reject, errorFromClient);
129132
}
130133
});
131134

132-
private handleJsonError(err: any, data: any, requestId: string, reject: Function) {
135+
private handleJsonError(err: any, data: any, requestId: string, reject: Function, errorFromClient?: boolean) {
133136
let description = data;
134137
const statusCode = description?.error?.http_status;
135138
const grpcCode = description?.error?.grpc_code;
136-
const details = description?.error?.details;
137-
139+
let details = description?.error?.details;
140+
141+
if (errorFromClient !== undefined) {
142+
details = Array.isArray(details)
143+
? [...details, { errorFromClient: errorFromClient }]
144+
: [{ errorFromClient: errorFromClient }];
145+
}
146+
138147
description = description?.error?.message || description;
139148
this.logAndRejectError(description, err, requestId, reject, statusCode, grpcCode, details);
140149
}
141150

142-
private handleTextError(err: any, data: any, requestId: string, reject: Function) {
143-
this.logAndRejectError(data, err, requestId, reject);
151+
private handleTextError(err: any, data: any, requestId: string, reject: Function, errorFromClient?: boolean) {
152+
let details: any = [];
153+
154+
if (errorFromClient !== undefined) {
155+
details.push({ errorFromClient });
156+
}
157+
158+
this.logAndRejectError(data, err, requestId, reject, undefined, undefined, details);
144159
}
145160

146-
private handleGenericError(err: any, requestId: string, reject: Function) {
161+
private handleGenericError(err: any, requestId: string, reject: Function, errorFromClient?: boolean) {
147162
const description = err?.response?.data || err?.message || errorMessages.ERROR_OCCURRED;
148-
this.logAndRejectError(description, err, requestId, reject);
163+
let details: any = [];
164+
165+
if (errorFromClient !== undefined) {
166+
details.push({ errorFromClient });
167+
}
168+
this.logAndRejectError(description, err, requestId, reject, undefined, undefined, details);
149169
}
150170

151171
private logAndRejectError(

‎test/vault/client/client.test.js‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,70 @@ describe('VaultClient', () => {
301301
expect(err).toBeInstanceOf(SkyflowError);
302302
});
303303
});
304+
305+
test('should handle JSON error responses correctly with error-from-client header', () => {
306+
const errorResponse = {
307+
response: {
308+
headers: { 'content-type': 'application/json', 'x-request-id': '12345', 'error-from-client': 'true' },
309+
data: { error: { message: 'JSON error occurred', http_status: 400, } },
310+
status: 400,
311+
},
312+
};
313+
vaultClient.failureResponse(errorResponse).catch(err => {
314+
expect(err).toBeInstanceOf(SkyflowError);
315+
})
316+
});
317+
318+
test('should handle JSON error responses correctly with error-from-client header and details list', () => {
319+
const errorResponse = {
320+
response: {
321+
headers: { 'content-type': 'application/json', 'x-request-id': '12345', 'error-from-client': 'true' },
322+
data: { error: { message: 'JSON error occurred', http_status: 400, details: [] } },
323+
status: 400,
324+
},
325+
};
326+
vaultClient.failureResponse(errorResponse).catch(err => {
327+
expect(err).toBeInstanceOf(SkyflowError);
328+
})
329+
});
330+
331+
test('should handle JSON error responses correctly with error-from-client header and details being null ', () => {
332+
const errorResponse = {
333+
response: {
334+
headers: { 'content-type': 'application/json', 'x-request-id': '12345', 'error-from-client': 'true' },
335+
data: { error: { message: 'JSON error occurred', http_status: 400, details: null } },
336+
status: 400,
337+
},
338+
};
339+
vaultClient.failureResponse(errorResponse).catch(err => {
340+
expect(err).toBeInstanceOf(SkyflowError);
341+
})
342+
});
343+
344+
test('should handle text error responses correctly with error-from-client header', () => {
345+
const errorResponse = {
346+
response: {
347+
headers: { 'content-type': 'text/plain', 'x-request-id': '12345', 'error-from-client': 'false' },
348+
data: 'Text error occurred',
349+
status: 500,
350+
},
351+
};
352+
vaultClient.failureResponse(errorResponse).catch(err => {
353+
expect(err).toBeInstanceOf(SkyflowError);
354+
})
355+
});
356+
357+
test('should handle generic errors without content-type and with error-from-client header', () => {
358+
const errorResponse = {
359+
response: {
360+
headers: {'error-from-client': 'true'},
361+
status: 500,
362+
},
363+
};
364+
vaultClient.failureResponse(errorResponse).catch(err => {
365+
expect(err).toBeInstanceOf(SkyflowError);
366+
});
367+
});
304368
});
305369

306370
describe('updateClientConfig', () => {

0 commit comments

Comments
 (0)