Skip to content

Commit 2b6112d

Browse files
authored
Surface get/post errors (#7721)
If the GET/POST calls fail, say in case of CORS header missing cases, we do not post the exact error seen in the JS to the application. This PR updates the same and also changes the error type to NetworkError.
1 parent 872c705 commit 2b6112d

File tree

6 files changed

+55
-24
lines changed

6 files changed

+55
-24
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Add error messaging and change type for get/post failures #7721",
4+
"packageName": "@azure/msal-browser",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Add optional parameter to NetworkError for error specifics #7721",
4+
"packageName": "@azure/msal-common",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

lib/msal-browser/src/network/FetchClient.ts

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,15 @@ export class FetchClient implements INetworkModule {
3939
headers: reqHeaders,
4040
});
4141
} catch (e) {
42-
throw createBrowserAuthError(
43-
window.navigator.onLine
44-
? BrowserAuthErrorCodes.getRequestFailed
45-
: BrowserAuthErrorCodes.noNetworkConnectivity
42+
throw createNetworkError(
43+
createBrowserAuthError(
44+
window.navigator.onLine
45+
? BrowserAuthErrorCodes.getRequestFailed
46+
: BrowserAuthErrorCodes.noNetworkConnectivity
47+
),
48+
undefined,
49+
undefined,
50+
e as Error
4651
);
4752
}
4853

@@ -60,7 +65,8 @@ export class FetchClient implements INetworkModule {
6065
BrowserAuthErrorCodes.failedToParseResponse
6166
),
6267
responseStatus,
63-
responseHeaders
68+
responseHeaders,
69+
e as Error
6470
);
6571
}
6672
}
@@ -88,10 +94,15 @@ export class FetchClient implements INetworkModule {
8894
body: reqBody,
8995
});
9096
} catch (e) {
91-
throw createBrowserAuthError(
92-
window.navigator.onLine
93-
? BrowserAuthErrorCodes.postRequestFailed
94-
: BrowserAuthErrorCodes.noNetworkConnectivity
97+
throw createNetworkError(
98+
createBrowserAuthError(
99+
window.navigator.onLine
100+
? BrowserAuthErrorCodes.postRequestFailed
101+
: BrowserAuthErrorCodes.noNetworkConnectivity
102+
),
103+
undefined,
104+
undefined,
105+
e as Error
95106
);
96107
}
97108

@@ -109,7 +120,8 @@ export class FetchClient implements INetworkModule {
109120
BrowserAuthErrorCodes.failedToParseResponse
110121
),
111122
responseStatus,
112-
responseHeaders
123+
responseHeaders,
124+
e as Error
113125
);
114126
}
115127
}
@@ -131,8 +143,11 @@ function getFetchHeaders(options?: NetworkRequestOptions): Headers {
131143
});
132144
return headers;
133145
} catch (e) {
134-
throw createBrowserAuthError(
135-
BrowserAuthErrorCodes.failedToBuildHeaders
146+
throw createNetworkError(
147+
createBrowserAuthError(BrowserAuthErrorCodes.failedToBuildHeaders),
148+
undefined,
149+
undefined,
150+
e as Error
136151
);
137152
}
138153
}

lib/msal-browser/test/network/FetchClient.spec.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ import {
55
NetworkError,
66
NetworkRequestOptions,
77
} from "@azure/msal-common";
8-
import {
9-
BrowserAuthErrorMessage,
10-
BrowserAuthError,
11-
} from "../../src/error/BrowserAuthError";
8+
import { BrowserAuthErrorMessage } from "../../src/error/BrowserAuthError";
129

1310
const mockResponse: Response = {
1411
headers: new Headers(),
@@ -140,10 +137,11 @@ describe("FetchClient.ts Unit Tests", () => {
140137
fetchClient
141138
.sendPostRequestAsync<any>(targetUri, requestOptions)
142139
.catch((e) => {
143-
expect(e).toBeInstanceOf(BrowserAuthError);
144-
expect(e.errorCode).toBe(
140+
expect(e).toBeInstanceOf(NetworkError);
141+
expect(e.errorCode).toContain(
145142
BrowserAuthErrorMessage.postRequestFailed.code
146143
);
144+
expect(e.errorMessage).toContain(`additionalErrorInfo:`);
147145
done();
148146
});
149147
});
@@ -161,10 +159,11 @@ describe("FetchClient.ts Unit Tests", () => {
161159
);
162160

163161
fetchClient.sendGetRequestAsync<any>(targetUri).catch((e) => {
164-
expect(e).toBeInstanceOf(BrowserAuthError);
162+
expect(e).toBeInstanceOf(NetworkError);
165163
expect(e.errorCode).toBe(
166164
BrowserAuthErrorMessage.getRequestFailed.code
167165
);
166+
expect(e.errorMessage).toContain(`additionalErrorInfo:`);
168167
done();
169168
});
170169
});
@@ -195,11 +194,11 @@ describe("FetchClient.ts Unit Tests", () => {
195194
.sendPostRequestAsync<any>(targetUri, requestOptions)
196195
.catch((e) => {
197196
expect(e).toBeInstanceOf(NetworkError);
198-
expect(e.error).toBeInstanceOf(BrowserAuthError);
199-
expect(e.errorCode).toBe(
197+
expect(e.errorCode).toContain(
200198
BrowserAuthErrorMessage.failedToParseNetworkResponse
201199
.code
202200
);
201+
expect(e.errorMessage).toContain(`additionalErrorInfo:`);
203202
done();
204203
});
205204
});
@@ -235,10 +234,11 @@ describe("FetchClient.ts Unit Tests", () => {
235234
fetchClient
236235
.sendPostRequestAsync<any>(targetUri, requestOptions)
237236
.catch((e) => {
238-
expect(e).toBeInstanceOf(BrowserAuthError);
237+
expect(e).toBeInstanceOf(NetworkError);
239238
expect(e.errorCode).toBe(
240239
BrowserAuthErrorMessage.noNetworkConnectivity.code
241240
);
241+
expect(e.errorMessage).toContain(`additionalErrorInfo:`);
242242
done();
243243
});
244244
});

lib/msal-common/apiReview/msal-common.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2017,7 +2017,7 @@ export function createInteractionRequiredAuthError(errorCode: string): Interacti
20172017
// Warning: (ae-missing-release-tag) "createNetworkError" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal)
20182018
//
20192019
// @public
2020-
export function createNetworkError(error: AuthError, httpStatus?: number, responseHeaders?: Record<string, string>): NetworkError;
2020+
export function createNetworkError(error: AuthError, httpStatus?: number, responseHeaders?: Record<string, string>, additionalError?: Error): NetworkError;
20212021

20222022
// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen
20232023
// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen

lib/msal-common/src/error/NetworkError.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ export class NetworkError extends AuthError {
3838
export function createNetworkError(
3939
error: AuthError,
4040
httpStatus?: number,
41-
responseHeaders?: Record<string, string>
41+
responseHeaders?: Record<string, string>,
42+
additionalError?: Error
4243
): NetworkError {
44+
error.errorMessage = `${error.errorMessage}, additionalErrorInfo: error.name:${additionalError?.name}, error.message:${additionalError?.message}`;
4345
return new NetworkError(error, httpStatus, responseHeaders);
4446
}

0 commit comments

Comments
 (0)