Skip to content

Commit c734662

Browse files
committed
Add new error mapping for http error code 403 and 404
1 parent 056ed89 commit c734662

File tree

5 files changed

+77
-2
lines changed

5 files changed

+77
-2
lines changed

IdentityCore/src/MSIDError.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ typedef NS_ENUM(NSInteger, MSIDErrorCode)
171171
*/
172172

173173
MSIDErrorServerUnhandledResponse = -51500,
174+
// http status Code 403 or 404
175+
MSIDErrorUnExpectedHttpResponse = -51501,
174176

175177
/*!
176178
=========================================================

IdentityCore/src/MSIDError.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,8 @@ MSIDErrorCode MSIDErrorCodeForOAuthErrorWithSubErrorCode(NSString *oauthError, M
224224
@(MSIDErrorServerError),
225225
],
226226
MSIDHttpErrorCodeDomain : @[
227-
@(MSIDErrorServerUnhandledResponse)
227+
@(MSIDErrorServerUnhandledResponse),
228+
@(MSIDErrorUnExpectedHttpResponse)
228229
]
229230

230231
// TODO: add new codes here
@@ -301,6 +302,8 @@ void MSIDFillAndLogError(NSError **error, MSIDErrorCode errorCode, NSString *err
301302
// HTTP errors
302303
case MSIDErrorServerUnhandledResponse:
303304
return @"MSIDErrorServerUnhandledResponse";
305+
case MSIDErrorUnExpectedHttpResponse:
306+
return @"MSIDErrorUnExpectedHttpResponse";
304307
// Authority validation errors
305308
case MSIDErrorAuthorityValidation:
306309
return @"MSIDErrorAuthorityValidation";

IdentityCore/src/network/error_handler/MSIDAADRequestErrorHandler.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,13 @@ - (void)handleError:(NSError *)error
150150
}
151151
}
152152

153-
NSError *httpError = MSIDCreateError(MSIDHttpErrorCodeDomain, MSIDErrorServerUnhandledResponse, errorDescription, nil, nil, nil, context.correlationId, additionalInfo, YES);
153+
NSError *httpUnderlyingError = nil;
154+
if (httpResponse.statusCode == 403 || httpResponse.statusCode == 404)
155+
{
156+
httpUnderlyingError = MSIDCreateError(MSIDHttpErrorCodeDomain, MSIDErrorUnExpectedHttpResponse, errorDescription, nil, nil, nil, context.correlationId, nil, YES);
157+
}
158+
159+
NSError *httpError = MSIDCreateError(MSIDHttpErrorCodeDomain, MSIDErrorServerUnhandledResponse, errorDescription, nil, nil, httpUnderlyingError, context.correlationId, additionalInfo, YES);
154160

155161
if (completionBlock) completionBlock(nil, httpError);
156162
}

IdentityCore/tests/MSIDAADRequestErrorHandlerTests.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ - (void)testHandleError_whenItIsNotServerError_shouldReturnStatusCodeAndHeaders
191191

192192
XCTAssertEqualObjects(returnError.domain, MSIDHttpErrorCodeDomain);
193193
XCTAssertEqual(returnError.code, MSIDErrorServerUnhandledResponse);
194+
NSError *underlyingError = returnError.userInfo[NSUnderlyingErrorKey];
195+
XCTAssertEqual(underlyingError.code, MSIDErrorUnExpectedHttpResponse);
194196
XCTAssertEqualObjects(returnError.userInfo[MSIDHTTPHeadersKey], @{@"headerKey":@"headerValue"});
195197

196198
XCTAssertNil(errorResponse);
@@ -275,6 +277,8 @@ - (void)testHandleError_whenItIsServerError_shouldReturnResponseCodeInError
275277

276278
XCTAssertEqualObjects(returnError.domain, MSIDHttpErrorCodeDomain);
277279
XCTAssertEqual(returnError.code, MSIDErrorServerUnhandledResponse);
280+
NSError *underlyingError = returnError.userInfo[NSUnderlyingErrorKey];
281+
XCTAssertEqual(underlyingError.code, MSIDErrorUnExpectedHttpResponse);
278282
XCTAssertEqualObjects(returnError.userInfo[MSIDHTTPResponseCodeKey], @"404");
279283
}
280284

IdentityCore/tests/integration/ios/MSIDDefaultSilentTokenRequestTests.m

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,66 @@ - (void)testAcquireTokenSilent_when429ThrottledErrorReturned_shouldReturnAllHead
13361336
[self waitForExpectationsWithTimeout:1.0 handler:nil];
13371337
}
13381338

1339+
1340+
- (void)testAcquireTokenSilent_when403HttpCodeReturned_shouldReturnMSIDErrorUnexpectedHttpResponseInUnderlyingError
1341+
{
1342+
MSIDRequestParameters *silentParameters = [self silentRequestParameters];
1343+
MSIDDefaultTokenCacheAccessor *tokenCache = self.tokenCache;
1344+
1345+
[self saveExpiredTokensInCache:tokenCache configuration:silentParameters.msidConfiguration];
1346+
silentParameters.accountIdentifier = [[MSIDAccountIdentifier alloc] initWithDisplayableId:DEFAULT_TEST_ID_TOKEN_USERNAME homeAccountId:DEFAULT_TEST_HOME_ACCOUNT_ID];
1347+
1348+
NSString *authority = DEFAULT_TEST_AUTHORITY_GUID;
1349+
MSIDTestURLResponse *discoveryResponse = [MSIDTestURLResponse discoveryResponseForAuthority:authority];
1350+
[MSIDTestURLSession addResponse:discoveryResponse];
1351+
1352+
MSIDTestURLResponse *oidcResponse = [MSIDTestURLResponse oidcResponseForAuthority:authority];
1353+
[MSIDTestURLSession addResponse:oidcResponse];
1354+
1355+
NSMutableDictionary *reqHeaders = [[MSIDTestURLResponse msidDefaultRequestHeaders] mutableCopy];
1356+
[reqHeaders setObject:@"application/x-www-form-urlencoded" forKey:@"Content-Type"];
1357+
1358+
MSIDTestURLResponse *errorTokenResponse =
1359+
[MSIDTestURLResponse requestURLString:DEFAULT_TEST_TOKEN_ENDPOINT_GUID
1360+
requestHeaders:reqHeaders
1361+
requestParamsBody:@{ @"client_id" : @"my_client_id",
1362+
@"scope" : @"user.read tasks.read openid profile offline_access",
1363+
@"grant_type" : @"refresh_token",
1364+
@"refresh_token" : DEFAULT_TEST_REFRESH_TOKEN,
1365+
MSID_OAUTH2_REDIRECT_URI : [[self silentRequestParameters] redirectUri],
1366+
@"client_info" : @"1"}
1367+
responseURLString:DEFAULT_TEST_TOKEN_ENDPOINT_GUID
1368+
responseCode:403
1369+
httpHeaderFields:@{@"Retry-After": @"256",
1370+
@"Other-Header-Field": @"Other header field"
1371+
}
1372+
dictionaryAsJSON:nil];
1373+
1374+
[errorTokenResponse->_requestHeaders removeObjectForKey:@"Content-Length"];
1375+
1376+
[MSIDTestURLSession addResponse:errorTokenResponse];
1377+
1378+
MSIDDefaultSilentTokenRequest *silentRequest = [[MSIDDefaultSilentTokenRequest alloc] initWithRequestParameters:silentParameters
1379+
forceRefresh:NO
1380+
oauthFactory:[MSIDAADV2Oauth2Factory new]
1381+
tokenResponseValidator:[MSIDDefaultTokenResponseValidator new]
1382+
tokenCache:tokenCache
1383+
accountMetadataCache:self.accountMetadataCache];
1384+
1385+
XCTestExpectation *expectation = [self expectationWithDescription:@"silent request"];
1386+
1387+
[silentRequest executeRequestWithCompletion:^(MSIDTokenResult * _Nullable result, NSError * _Nullable error) {
1388+
1389+
XCTAssertNotNil(error);
1390+
XCTAssertNil(result);
1391+
XCTAssertEqual(error.code, MSIDErrorServerUnhandledResponse);
1392+
XCTAssertEqualObjects(error.domain, MSIDHttpErrorCodeDomain);
1393+
XCTAssertEqualObjects(error.userInfo[MSIDHTTPResponseCodeKey], @"403");
1394+
[expectation fulfill];
1395+
}];
1396+
1397+
[self waitForExpectationsWithTimeout:1.0 handler:nil];
1398+
}
13391399
- (void)testAcquireTokenSilent_whenTokenEndpointInDifferentCloud_shouldReturnInteractionRequired
13401400
{
13411401
// Prepare RT in cache

0 commit comments

Comments
 (0)