@@ -16,7 +16,8 @@ class SkipAuthorize extends Extra {
1616@injectable
1717class AuthorizeInterceptor extends Interceptor {
1818 final TokenRepository repository;
19- static const _retriedKey = '_retried' ;
19+ static const _authorizeRetriedKey = '_authorizeRetried' ;
20+ static const _retriesKey = '_retries' ;
2021 static const _skipKey = '_skip' ;
2122 final mutex = ReadWriteMutex ();
2223
@@ -47,11 +48,20 @@ class AuthorizeInterceptor extends Interceptor {
4748 void onError (DioException err, ErrorInterceptorHandler handler) async {
4849 final dio = getDio ();
4950 final statusCode = err.response? .statusCode;
51+ if (statusCode == 502 ) {
52+ if (err.requestOptions.retries >= 4 ) return handler.next (err);
53+ await Future .delayed (
54+ Duration (seconds: (1 << err.requestOptions.retries).clamp (1 , 30 )),
55+ );
56+ err.requestOptions.retries++ ;
57+ final retriedResponse = await dio.fetch (err.requestOptions);
58+ return handler.resolve (retriedResponse);
59+ }
5060 if (statusCode != 401 ) return handler.next (err);
5161 final token = await repository.token.first;
5262 if (token == null ) return handler.next (err);
53- if (err.requestOptions.retried ) return handler.next (err);
54- err.requestOptions.retried = true ;
63+ if (err.requestOptions.authorizeRetried ) return handler.next (err);
64+ err.requestOptions.authorizeRetried = true ;
5565
5666 try {
5767 if (! (await refresh ())) return handler.next (err);
@@ -91,8 +101,17 @@ class AuthorizeInterceptor extends Interceptor {
91101}
92102
93103extension _RequestOptionsX on RequestOptions {
94- bool get retried => extra.containsKey (AuthorizeInterceptor ._retriedKey);
95- set retried (bool value) => extra[AuthorizeInterceptor ._retriedKey] = value;
104+ int get retries => extra.containsKey (AuthorizeInterceptor ._retriesKey)
105+ ? extra[AuthorizeInterceptor ._retriesKey] as int
106+ : 0 ;
107+ set retries (int value) => extra[AuthorizeInterceptor ._retriesKey] = value;
108+
109+ bool get authorizeRetried =>
110+ extra.containsKey (AuthorizeInterceptor ._authorizeRetriedKey)
111+ ? extra[AuthorizeInterceptor ._authorizeRetriedKey] as bool
112+ : false ;
113+ set authorizeRetried (bool value) =>
114+ extra[AuthorizeInterceptor ._authorizeRetriedKey] = value;
96115
97116 bool get skip => extra.containsKey (AuthorizeInterceptor ._skipKey);
98117}
0 commit comments