Skip to content
This repository was archived by the owner on Apr 18, 2023. It is now read-only.

Commit bd4a15a

Browse files
authored
Merge pull request #18 from microsoftgraph/vidadhee/MiddlewareOptions
Add Middleware options for RetryHandler and RedirectHandler
2 parents 82de4ee + 14246b0 commit bd4a15a

File tree

20 files changed

+694
-32
lines changed

20 files changed

+694
-32
lines changed

MSGraphClientSDK/MSGraphClientSDK.xcodeproj/project.pbxproj

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
E52AD9F62133E740005FED47 /* MSURLSessionUploadTaskTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E52AD9F52133E73F005FED47 /* MSURLSessionUploadTaskTests.m */; };
3535
E566782E2150BC4F00C6B7AE /* MSRedirectHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E566782D2150BC4F00C6B7AE /* MSRedirectHandlerTests.m */; };
3636
E56678302150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E566782F2150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m */; };
37+
E56B101C2220086300ED640F /* MSRedirectHandlerOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = E56B101A2220086300ED640F /* MSRedirectHandlerOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
38+
E56B101D2220086300ED640F /* MSRedirectHandlerOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = E56B101B2220086300ED640F /* MSRedirectHandlerOptions.m */; };
39+
E56B102022237F6500ED640F /* MSRetryHandlerOptionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E56B101F22237F6500ED640F /* MSRetryHandlerOptionsTests.m */; };
40+
E56B1022222382E400ED640F /* MSRedirectHandlerOptionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E56B1021222382E400ED640F /* MSRedirectHandlerOptionsTests.m */; };
3741
E56FDB9321D36A98001DFE68 /* MSURLSessionDownloadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E56FDB8B21D36A98001DFE68 /* MSURLSessionDownloadTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
3842
E56FDB9421D36A98001DFE68 /* MSURLSessionTask.m in Sources */ = {isa = PBXBuildFile; fileRef = E56FDB8C21D36A98001DFE68 /* MSURLSessionTask.m */; };
3943
E56FDB9521D36A98001DFE68 /* MSURLSessionUploadTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E56FDB8D21D36A98001DFE68 /* MSURLSessionUploadTask.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -47,6 +51,9 @@
4751
E573EE0B213427ED00C5E884 /* MSURLSessionTaskDelegateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E573EE0A213427ED00C5E884 /* MSURLSessionTaskDelegateTests.m */; };
4852
E573EE0D213525BA00C5E884 /* MSGraphWorkloadsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E573EE0C213525BA00C5E884 /* MSGraphWorkloadsTests.m */; };
4953
E573EE102136569F00C5E884 /* UserPhoto.jpg in Resources */ = {isa = PBXBuildFile; fileRef = E573EE0F2136569F00C5E884 /* UserPhoto.jpg */; };
54+
E59EBFEF221D3B6800B4B279 /* MSRetryHandlerOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = E59EBFEC221D3B6700B4B279 /* MSRetryHandlerOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
55+
E59EBFF0221D3B6800B4B279 /* MSRetryHandlerOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = E59EBFED221D3B6700B4B279 /* MSRetryHandlerOptions.m */; };
56+
E59EBFF1221D3B6800B4B279 /* MSMiddlewareOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = E59EBFEE221D3B6700B4B279 /* MSMiddlewareOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
5057
E5B6DB9821497DAA00836E1D /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5B6DB9621497D7C00836E1D /* libOCMock.a */; };
5158
E5DC73DF211412BF0040BAB6 /* MSGraphClientSDK.h in Headers */ = {isa = PBXBuildFile; fileRef = E5DC73DD211412BF0040BAB6 /* MSGraphClientSDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
5259
E5DC7403211418050040BAB6 /* MSAuthenticationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = E5DC73EB211418040040BAB6 /* MSAuthenticationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -108,6 +115,10 @@
108115
E52AD9F52133E73F005FED47 /* MSURLSessionUploadTaskTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSURLSessionUploadTaskTests.m; sourceTree = "<group>"; };
109116
E566782D2150BC4F00C6B7AE /* MSRedirectHandlerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRedirectHandlerTests.m; sourceTree = "<group>"; };
110117
E566782F2150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSAuthenticationHandlerTests.m; sourceTree = "<group>"; };
118+
E56B101A2220086300ED640F /* MSRedirectHandlerOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MSRedirectHandlerOptions.h; sourceTree = "<group>"; };
119+
E56B101B2220086300ED640F /* MSRedirectHandlerOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRedirectHandlerOptions.m; sourceTree = "<group>"; };
120+
E56B101F22237F6500ED640F /* MSRetryHandlerOptionsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRetryHandlerOptionsTests.m; sourceTree = "<group>"; };
121+
E56B1021222382E400ED640F /* MSRedirectHandlerOptionsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSRedirectHandlerOptionsTests.m; sourceTree = "<group>"; };
111122
E56FDB8B21D36A98001DFE68 /* MSURLSessionDownloadTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSURLSessionDownloadTask.h; sourceTree = "<group>"; };
112123
E56FDB8C21D36A98001DFE68 /* MSURLSessionTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSURLSessionTask.m; sourceTree = "<group>"; };
113124
E56FDB8D21D36A98001DFE68 /* MSURLSessionUploadTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSURLSessionUploadTask.h; sourceTree = "<group>"; };
@@ -121,6 +132,9 @@
121132
E573EE0A213427ED00C5E884 /* MSURLSessionTaskDelegateTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSURLSessionTaskDelegateTests.m; sourceTree = "<group>"; };
122133
E573EE0C213525BA00C5E884 /* MSGraphWorkloadsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MSGraphWorkloadsTests.m; sourceTree = "<group>"; };
123134
E573EE0F2136569F00C5E884 /* UserPhoto.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = UserPhoto.jpg; sourceTree = "<group>"; };
135+
E59EBFEC221D3B6700B4B279 /* MSRetryHandlerOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSRetryHandlerOptions.h; sourceTree = "<group>"; };
136+
E59EBFED221D3B6700B4B279 /* MSRetryHandlerOptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MSRetryHandlerOptions.m; sourceTree = "<group>"; };
137+
E59EBFEE221D3B6700B4B279 /* MSMiddlewareOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MSMiddlewareOptions.h; sourceTree = "<group>"; };
124138
E5B6DB8C21497CAC00836E1D /* OCMockObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMockObject.h; sourceTree = "<group>"; };
125139
E5B6DB8D21497CAC00836E1D /* OCMMacroState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMMacroState.h; sourceTree = "<group>"; };
126140
E5B6DB8E21497CAC00836E1D /* OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OCMock.h; sourceTree = "<group>"; };
@@ -294,22 +308,32 @@
294308
E52AD9F82133F16D005FED47 /* Middleware */ = {
295309
isa = PBXGroup;
296310
children = (
311+
E56B101E22237F3900ED640F /* Options */,
297312
E573EE1221367A7800C5E884 /* Implementations */,
298313
);
299314
path = Middleware;
300315
sourceTree = "<group>";
301316
};
317+
E56B101E22237F3900ED640F /* Options */ = {
318+
isa = PBXGroup;
319+
children = (
320+
E56B101F22237F6500ED640F /* MSRetryHandlerOptionsTests.m */,
321+
E56B1021222382E400ED640F /* MSRedirectHandlerOptionsTests.m */,
322+
);
323+
path = Options;
324+
sourceTree = "<group>";
325+
};
302326
E56FDB8A21D36A98001DFE68 /* Session Tasks */ = {
303327
isa = PBXGroup;
304328
children = (
305-
E56FDB8B21D36A98001DFE68 /* MSURLSessionDownloadTask.h */,
306-
E56FDB8C21D36A98001DFE68 /* MSURLSessionTask.m */,
307-
E56FDB8D21D36A98001DFE68 /* MSURLSessionUploadTask.h */,
308-
E56FDB8E21D36A98001DFE68 /* MSURLSessionDataTask.m */,
309329
E56FDB8F21D36A98001DFE68 /* MSURLSessionTask.h */,
330+
E56FDB8C21D36A98001DFE68 /* MSURLSessionTask.m */,
331+
E56FDB8B21D36A98001DFE68 /* MSURLSessionDownloadTask.h */,
310332
E56FDB9021D36A98001DFE68 /* MSURLSessionDownloadTask.m */,
311-
E56FDB9121D36A98001DFE68 /* MSURLSessionUploadTask.m */,
312333
E56FDB9221D36A98001DFE68 /* MSURLSessionDataTask.h */,
334+
E56FDB8E21D36A98001DFE68 /* MSURLSessionDataTask.m */,
335+
E56FDB8D21D36A98001DFE68 /* MSURLSessionUploadTask.h */,
336+
E56FDB9121D36A98001DFE68 /* MSURLSessionUploadTask.m */,
313337
);
314338
path = "Session Tasks";
315339
sourceTree = "<group>";
@@ -345,6 +369,18 @@
345369
path = Implementations;
346370
sourceTree = "<group>";
347371
};
372+
E59EBFEB221D3B6700B4B279 /* Options */ = {
373+
isa = PBXGroup;
374+
children = (
375+
E59EBFEE221D3B6700B4B279 /* MSMiddlewareOptions.h */,
376+
E59EBFEC221D3B6700B4B279 /* MSRetryHandlerOptions.h */,
377+
E59EBFED221D3B6700B4B279 /* MSRetryHandlerOptions.m */,
378+
E56B101A2220086300ED640F /* MSRedirectHandlerOptions.h */,
379+
E56B101B2220086300ED640F /* MSRedirectHandlerOptions.m */,
380+
);
381+
path = Options;
382+
sourceTree = "<group>";
383+
};
348384
E5B6DB6921497A3300836E1D /* Frameworks */ = {
349385
isa = PBXGroup;
350386
children = (
@@ -427,6 +463,7 @@
427463
E5DC73EA211418040040BAB6 /* Middleware */ = {
428464
isa = PBXGroup;
429465
children = (
466+
E59EBFEB221D3B6700B4B279 /* Options */,
430467
E5DC73F8211418040040BAB6 /* Protocols */,
431468
E5069AC3211AACCD00432372 /* Implementations */,
432469
);
@@ -488,7 +525,10 @@
488525
E5204FF8216F371400E64160 /* MSErrorCodes.h in Headers */,
489526
E5204FEF216F1D9900E64160 /* MSBatchRequestStep.h in Headers */,
490527
E5ECE0A42146657900A289C2 /* MSRedirectHandler.h in Headers */,
528+
E59EBFF1221D3B6800B4B279 /* MSMiddlewareOptions.h in Headers */,
529+
E59EBFEF221D3B6800B4B279 /* MSRetryHandlerOptions.h in Headers */,
491530
E51E616C216DE4D300F1B3C0 /* MSRetryHandler.h in Headers */,
531+
E56B101C2220086300ED640F /* MSRedirectHandlerOptions.h in Headers */,
492532
E5DC73DF211412BF0040BAB6 /* MSGraphClientSDK.h in Headers */,
493533
);
494534
runOnlyForDeploymentPostprocessing = 0;
@@ -598,7 +638,9 @@
598638
E5204FFF2173A7C200E64160 /* MSBatchRequestStepTests.m in Sources */,
599639
E52050042174C1DB00E64160 /* MSBatchResponseContentTests.m in Sources */,
600640
E51E616F216E073F00F1B3C0 /* MSRetryHandlerTests.m in Sources */,
641+
E56B1022222382E400ED640F /* MSRedirectHandlerOptionsTests.m in Sources */,
601642
E573EE072133FFF200C5E884 /* MSHTTPClientTests.m in Sources */,
643+
E56B102022237F6500ED640F /* MSRetryHandlerOptionsTests.m in Sources */,
602644
E52AD9E6212E8845005FED47 /* MSGraphClientSDKTests.h in Sources */,
603645
E56678302150E1AF00C6B7AE /* MSAuthenticationHandlerTests.m in Sources */,
604646
E52AD9F42133E171005FED47 /* MSURLSessionDownloadTaskTests.m in Sources */,
@@ -621,6 +663,8 @@
621663
E5204FF1216F1D9900E64160 /* MSBatchRequestContent.m in Sources */,
622664
E56FDB9421D36A98001DFE68 /* MSURLSessionTask.m in Sources */,
623665
E5204FF7216F371400E64160 /* MSErrorCodes.m in Sources */,
666+
E59EBFF0221D3B6800B4B279 /* MSRetryHandlerOptions.m in Sources */,
667+
E56B101D2220086300ED640F /* MSRedirectHandlerOptions.m in Sources */,
624668
E5DC741A21142C430040BAB6 /* MSClientFactory.m in Sources */,
625669
E5069AC9211AAEC900432372 /* MSConstants.m in Sources */,
626670
E56FDB9821D36A98001DFE68 /* MSURLSessionDownloadTask.m in Sources */,

MSGraphClientSDK/MSGraphClientSDK/Common/MSConstants.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
typedef NS_ENUM(NSInteger, MSClientErrorCode)
1111
{
12+
MSCLientErrorCodeSDKUpperLimitReached = -1,
1213
MSClientErrorCodeBadRequest = 400,
1314
MSClientErrorCodeUnauthorized = 401,
1415
MSClientErrorCodeForbidden = 403,
@@ -43,6 +44,14 @@ typedef NS_ENUM(NSInteger, MSExpectedResponseCodes)
4344
MSExpectedResponseCodesTemporaryRedirect = 307,
4445
};
4546

47+
typedef NS_ENUM(NSInteger, MSMiddlewareOptionsType)
48+
{
49+
MSMiddlewareOptionsTypeNone,
50+
MSMiddlewareOptionsTypeAuth,
51+
MSMiddlewareOptionsTypeRedirect,
52+
MSMiddlewareOptionsTypeRetry
53+
};
54+
4655
extern NSString *const MSGraphBaseURL;
4756
extern NSString *const MSHeaderSdkVersion;
4857
extern NSString *const MSGraphiOSSdkVersionHeaderPrefix;
@@ -53,9 +62,12 @@ extern NSString *const MSErrorDomain;
5362
extern NSString *const MSErrorTooManyRedirectsFormatString;
5463
extern NSString *const MSErrorLocationHeaderNotFoundString;
5564
extern NSString *const MSErrorOperationUnsuccessfulString;
65+
extern NSString *const MSErrorMaxRedirectsLimitExceededString;
5666

5767
extern NSString *const MSErrorTooManyRetries;
5868
extern NSString *const MSErrorTooManyRetriesFormatString;
69+
extern NSString *const MSErrorDelayLimitExceededString;
70+
extern NSString *const MSErrorMaxRetriesLimitExceededString;
5971

6072
extern NSString *const HTTPMethodGet;
6173
extern NSString *const HTTPMethodPut;

MSGraphClientSDK/MSGraphClientSDK/Common/MSConstants.m

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@
1111

1212

1313
NSString *const MSErrorDomain = @"com.microsoft.graph.errors";
14-
1514
NSString *const MSErrorTooManyRedirectsFormatString = @"More than %ld redirects encountered while sending the request.";
16-
1715
NSString *const MSErrorLocationHeaderNotFoundString = @"There is no location header in the redirect response.";
1816
NSString *const MSErrorOperationUnsuccessfulString = @"Operation was unsuccessful.";
17+
NSString *const MSErrorMaxRedirectsLimitExceededString = @"Limit for maximum redirects allowed is %ld.";
1918

20-
NSString *const MSErrorTooManyRetries = @"Too many retries";
2119

20+
NSString *const MSErrorTooManyRetries = @"Too many retries";
2221
NSString *const MSErrorTooManyRetriesFormatString = @"More than %ld retries encountered while sending the request.";
22+
NSString *const MSErrorDelayLimitExceededString = @"Limit for maximum delay allowed is %ld.";
23+
NSString *const MSErrorMaxRetriesLimitExceededString = @"Limit for maximum retries allowed is %ld";
2324

2425

2526
NSString *const HTTPMethodGet = @"GET";

MSGraphClientSDK/MSGraphClientSDK/Common/Session Tasks/MSURLSessionTask.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#import <Foundation/Foundation.h>
88
#import "MSHttpProvider.h"
9+
#import "MSMiddlewareOptions.h"
910

1011
/**
1112
The Upload Completion Handler to be called when an upload is completed.
@@ -35,6 +36,11 @@ typedef void (^HTTPRequestCompletionHandler)(id data, NSURLResponse * _Nullable
3536
*/
3637
@property (strong) MSHTTPClient *client;
3738

39+
/*
40+
This property can be used to set an array of custom middleware options specific for the execution of the Task.
41+
*/
42+
@property (nonatomic, strong) NSArray<MSMiddlewareOptions> *middlewareOptionsArray;
43+
3844
/**
3945
Creates an `MSURLSessionTask` with the given requests and client.
4046
@param request The request to use. Must not be nil.
@@ -53,4 +59,11 @@ typedef void (^HTTPRequestCompletionHandler)(id data, NSURLResponse * _Nullable
5359
*/
5460
- (void)cancel;
5561

62+
/*
63+
This method can be used by to get a specific middleware matching with the type provided in argument.
64+
@param middlewareOptionsType The type of middleware options that needs to be returned
65+
@return An instance of middleware options if a match is found otherwise it will be nil.
66+
*/
67+
- (id<MSMiddlewareOptions>)getMiddlewareOptionWithType:(MSMiddlewareOptionsType)middlewareOptionsType;
68+
5669
@end

MSGraphClientSDK/MSGraphClientSDK/Common/Session Tasks/MSURLSessionTask.m

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,23 @@ - (void)taskCompletedWithData:(id)data response:(NSURLResponse *)response andErr
8383
NSAssert(NO, @"Not Implemented, must implement in sub class");
8484
}
8585

86+
- (void)setMiddlewareOptionsArray:(NSArray<MSMiddlewareOptions> *)middlewareOptionsArray
87+
{
88+
_middlewareOptionsArray = [middlewareOptionsArray copy];
89+
}
90+
91+
- (id<MSMiddlewareOptions>)getMiddlewareOptionWithType:(MSMiddlewareOptionsType)middlewareOptionsType
92+
{
93+
id<MSMiddlewareOptions> middlewareOptionsToReturn;
94+
for(id<MSMiddlewareOptions> middlewareOptions in _middlewareOptionsArray)
95+
{
96+
if(middlewareOptionsType == middlewareOptions.middlewareOptionsType)
97+
{
98+
middlewareOptionsToReturn = middlewareOptions;
99+
break;
100+
}
101+
}
102+
return middlewareOptionsToReturn;
103+
}
104+
86105
@end

MSGraphClientSDK/MSGraphClientSDK/MSGraphClientSDK.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ FOUNDATION_EXPORT const unsigned char MSGraphClientSDKVersionString[];
2020
#import "MSGraphClientSDK/MSAuthenticationProvider.h"
2121
#import "MSGraphClientSDK/MSHttpProvider.h"
2222
#import "MSGraphClientSDK/MSGraphMiddleware.h"
23+
#import "MSGraphClientSDK/MSMiddlewareOptions.h"
2324

2425
#import "MSGraphClientSDK/MSURLSessionManager.h"
2526
#import "MSGraphClientSDK/MSClientFactory.h"
@@ -40,6 +41,9 @@ FOUNDATION_EXPORT const unsigned char MSGraphClientSDKVersionString[];
4041
#import "MSGraphClientSDK/MSBatchRequestContent.h"
4142
#import "MSGraphClientSDK/MSBatchResponseContent.h"
4243

44+
#import "MSGraphClientSDK/MSRetryHandlerOptions.h"
45+
#import "MSGraphClientSDK/MSRedirectHandlerOptions.h"
46+
4347

4448
#endif
4549

MSGraphClientSDK/MSGraphClientSDK/Middleware/Implementations/RedirectHandler/MSRedirectHandler.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
This class provides the mechanism to handle redirect response from Graph server. It is implmented as a middleware so it will be called during the execution of network calls.
99
*/
1010

11+
@class MSRedirectHandlerOptions;
12+
1113
@interface MSRedirectHandler : NSObject<MSGraphMiddleware>
1214

15+
/*
16+
This method initializes an instance of MSRedirectHandler with the provided MSRedirectHandlerOptions value.
17+
@param redirectHandlerOptions The options which will be used to control the behavior of this instance
18+
@return Instance of MSRedirectHandler
19+
*/
20+
- (instancetype)initWithOptions:(MSRedirectHandlerOptions *)redirectHandlerOptions;
21+
1322
@end

0 commit comments

Comments
 (0)