Skip to content

Commit 5cb7ce9

Browse files
authored
feat: retry on 502 error (#337)
1 parent 781a3cb commit 5cb7ce9

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
이동, 택시, 채팅, 지스트
1+
이동, 택시, 채팅, 지스트, 팟쥐, 팟지

lib/app/modules/auth/data/data_sources/remote/authorize_interceptor.dart

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class SkipAuthorize extends Extra {
1616
@injectable
1717
class 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

93103
extension _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
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: pot_g
22
description: "A new Flutter project."
33
publish_to: 'none'
4-
version: 1.0.12
4+
version: 1.0.13
55

66
environment:
77
sdk: ^3.9.0

0 commit comments

Comments
 (0)