Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions .idea/dio_retry.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"configurations": [
{
"name": "Dart",
"program": "bin/main.dart",
"program": "dio_retry/example/example.dart",
"request": "launch",
"type": "dart"
}
Expand Down
8 changes: 4 additions & 4 deletions dio_retry/example/example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@ main() async {
// Add the interceptor with optional options
dio.interceptors.add(RetryInterceptor(
dio: dio,
logger: Logger("Retry"),
logger: Logger('Retry'),
options: const RetryOptions(
retryInterval: const Duration(seconds: 5),
retryInterval: Duration(seconds: 5),
),
));

/// Sending a failing request for 3 times with a 5s interval
try {
await dio.get("http://www.mqldkfjmdisljfmlksqdjfmlkj.dev");
await dio.get('http://www.apple111.com');
} catch (e) {
print("End error : $e");
print('End error : $e');
}
}
38 changes: 18 additions & 20 deletions dio_retry/lib/src/options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ class RetryOptions {
/// The interval before a retry.
final Duration retryInterval;

/// Evaluating if a retry is necessary.regarding the error.
///
/// It can be a good candidate for additional operations too, like
/// updating authentication token in case of a unauthorized error (be careful
/// with concurrency though).
///
/// Evaluating if a retry is necessary.regarding the error.
///
/// It can be a good candidate for additional operations too, like
/// updating authentication token in case of a unauthorized error (be careful
/// with concurrency though).
///
/// Defaults to [defaultRetryEvaluator].
RetryEvaluator get retryEvaluator => this._retryEvaluator ?? defaultRetryEvaluator;
RetryEvaluator get retryEvaluator => _retryEvaluator ?? defaultRetryEvaluator;

final RetryEvaluator _retryEvaluator;

Expand All @@ -28,20 +28,21 @@ class RetryOptions {
this.retryInterval = const Duration(seconds: 1)})
: assert(retries != null),
assert(retryInterval != null),
this._retryEvaluator = retryEvaluator;
_retryEvaluator = retryEvaluator;

factory RetryOptions.noRetry() {
return RetryOptions(
retries: 0,
);
}

static const extraKey = "cache_retry_request";
static const extraKey = 'cache_retry_request';

/// Returns [true] only if the response hasn't been cancelled or got
/// a bas status code.
static FutureOr<bool> defaultRetryEvaluator(DioError error) {
return error.type != DioErrorType.CANCEL && error.type != DioErrorType.RESPONSE;
return error.type != DioErrorType.cancel &&
error.type != DioErrorType.response;
}

factory RetryOptions.fromExtra(RequestOptions request) {
Expand All @@ -64,16 +65,13 @@ class RetryOptions {
}

Options toOptions() {
return Options(
extra: this.toExtra()
);
return Options(extra: toExtra());
}

Options mergeIn(Options options) {
return options.merge(
extra: <String,dynamic>{}
..addAll(options.extra ?? {})
..addAll(this.toExtra())
);
}
// Options mergeIn(Options options) {
// return options.merge(
// extra: <String, dynamic>{}
// ..addAll(options.extra ?? {})
// ..addAll(toExtra()));
// }
}
31 changes: 16 additions & 15 deletions dio_retry/lib/src/retry_interceptor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ class RetryInterceptor extends Interceptor {
final RetryOptions options;

RetryInterceptor({@required this.dio, this.logger, RetryOptions options})
: this.options = options ?? const RetryOptions();
: options = options ?? const RetryOptions();

@override
onError(DioError err) async {
var extra = RetryOptions.fromExtra(err.request) ?? this.options;
Future onError(DioError err, ErrorInterceptorHandler handler) async {
var extra = RetryOptions.fromExtra(err.requestOptions) ?? options;

// var shouldRetry = extra.retries > 0 && await extra.retryEvaluator(err); (bugged, as per https://github.com/aloisdeniel/dio_retry/pull/5)
var shouldRetry = extra.retries > 0 && await options.retryEvaluator(err);
Expand All @@ -26,26 +26,27 @@ class RetryInterceptor extends Interceptor {

// Update options to decrease retry count before new try
extra = extra.copyWith(retries: extra.retries - 1);
err.request.extra = err.request.extra..addAll(extra.toExtra());
err.requestOptions.extra = err.requestOptions.extra
..addAll(extra.toExtra());

try {
logger?.warning(
"[${err.request.uri}] An error occured during request, trying a again (remaining tries: ${extra.retries}, error: ${err.error})");
'[${err.requestOptions.path}] An error occured during request, trying a again (remaining tries: ${extra.retries}, error: ${err.error})');
// We retry with the updated options
return await this.dio.request(
err.request.path,
cancelToken: err.request.cancelToken,
data: err.request.data,
onReceiveProgress: err.request.onReceiveProgress,
onSendProgress: err.request.onSendProgress,
queryParameters: err.request.queryParameters,
options: err.request,
);
return await dio.request(
err.requestOptions.path,
cancelToken: err.requestOptions.cancelToken,
data: err.requestOptions.data,
onReceiveProgress: err.requestOptions.onReceiveProgress,
onSendProgress: err.requestOptions.onSendProgress,
queryParameters: err.requestOptions.queryParameters,
options: extra.toOptions(),
);
} catch (e) {
return e;
}
}

return super.onError(err);
return super.onError(err, handler);
}
}
10 changes: 5 additions & 5 deletions dio_retry/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
name: dio_retry
description: A starting point for Dart libraries or applications.
version: 0.1.10-beta
version: 0.1.10-beta3
homepage: https://github.com/aloisdeniel/dio_retry
author: aloisdeniel <alois.deniel@outlook.com>

environment:
sdk: '>=2.2.0 <3.0.0'
sdk: '>=2.10.0 <3.0.0'

dependencies:
meta: ^1.1.6
logging: ^0.11.3
dio: ^3.0.0
meta: ^1.3.0
logging: ^1.0.1
dio: ^4.0.0

dev_dependencies:
pedantic: ^1.0.0
Expand Down