Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🔖 pre-release v8.0.0-rc.1 #598

Merged
merged 154 commits into from
Apr 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
f25fbe4
Fix Header Option Casting (#260)
yousinix May 25, 2021
3d47735
Fix for #259 (#263)
JEuler May 31, 2021
8be965b
4.0.1 fixes (#264)
JEuler Jun 1, 2021
bcb0304
analyzer dependency upgraded (#296)
luis901101 Sep 18, 2021
4e4607e
fix(generator): fix PartValueFile value not nullable if arg is (#288)…
rIIh Sep 18, 2021
939a83f
Chopper generator release 4.0.2 (#297)
JEuler Sep 23, 2021
ff0ec87
fix: fix this.body cast of null value when response body is null (#29…
rIIh Sep 23, 2021
ffcd945
Interpolation fixes (#275)
JEuler Sep 23, 2021
82b951f
encodeQueryComponent now encodeComponent (#278)
JEuler Sep 23, 2021
f7255b7
Prevent double call on token refreshment (#276)
JEuler Oct 10, 2021
ddefa94
Fixes for #309 #308 (#310)
JEuler Dec 7, 2021
0386c74
Remove new keyword from interceptors.md (#312)
michalsrutek Jan 3, 2022
d4dab0d
Analyzer upgrade (#320)
JEuler Jan 16, 2022
bbe2c7a
Add unnecessary_brace_in_string_interps to lint ignores (#317)
pingbird Jan 16, 2022
6bdbd63
Extend pragma to quiet the linter (#318)
vipw Jan 22, 2022
4185d14
Fix converter getting called twice if using an authenticator with a J…
maxroehrl Jan 30, 2022
dbf4272
migrate example to nullsafety (#331)
ipcjs Feb 22, 2022
976d457
Resolve problem in main_json_serializable example (#328)
ibadin Apr 24, 2022
cc2da20
Add @FiledMap @PartMap @PartFileMap (#335)
meysam1717 May 1, 2022
659b9f8
Upgrade of analyzer (#340)
JEuler Jun 20, 2022
e167ba6
Fix nullable QueryMap fails to compile (#344)
techouse Jul 14, 2022
f9009ce
Change return type of decodeJson to FutureOr in order to be able to s…
techouse Sep 7, 2022
5f2eb82
Migrate from pedantic to lints ^2.0.0 with lints/recommended.yaml (#349)
techouse Sep 7, 2022
02cf2e0
Version bumped for release (#352)
JEuler Sep 13, 2022
34b3bda
Revert analyzer to ^4.1.0 and silence linters for Element.enclosingEl…
techouse Sep 13, 2022
426a16e
[chopper_generator] Update analyzer to ^4.4.0 and code_builde to ^4.3…
techouse Sep 17, 2022
35fdf8f
Add Makefiles to streamline development (#357)
techouse Sep 17, 2022
5a59ebf
Add Bug Report Github issue template (#359)
techouse Sep 18, 2022
fcf3478
[chopper_generator] Add types to the generated variables (#360)
techouse Sep 19, 2022
6b3b840
Provide an example using an Isolate Worker Pool with Squadron (#361)
techouse Sep 19, 2022
d74790c
mapToQuery changes (#364)
techouse Oct 8, 2022
0882a7e
Version bumped / changelog update (#367)
JEuler Oct 8, 2022
e3fd623
Request extends http.BaseRequest (#370)
techouse Oct 13, 2022
bd8d65f
Exclude null query vars by default and add new @Method annotation inc…
techouse Oct 14, 2022
786c153
5.1.0 (dev) (#373)
JEuler Oct 15, 2022
9b2b867
[workflow] Upgrade mono_repo to v6.4.1 (#375)
techouse Oct 15, 2022
233678e
Update analyzer to >=4.4.0 <6.0.0 (#378)
techouse Oct 17, 2022
1b2f1fa
Update mono_repo to 6.4.2 (#380)
techouse Oct 18, 2022
1e3e7f4
add techouse (#382)
JEuler Oct 18, 2022
b0fd18f
[Feature] Replace the String based path with Uri (#383)
Guldem Oct 31, 2022
9d1d86c
:memo: Add Authenticator example (#386)
techouse Nov 20, 2022
2775a73
Update getting-started.md (#391)
erlangparasu Dec 11, 2022
11a9ca5
Fix #388 Triggering Authenticator double encodes body in POST, PUT, P…
techouse Dec 11, 2022
bdbe210
Add image upload test (#392)
techouse Dec 11, 2022
b6ea960
Release 5.2.0 (#394)
JEuler Dec 13, 2022
1719c83
6.0.0 (#397)
JEuler Dec 14, 2022
7453582
Configurable HttpLoggingInterceptor (#399)
Guldem Jan 6, 2023
fa73de3
Made apply headers field name case insensitive. (#400)
Guldem Jan 8, 2023
bd3d7cc
:bulb: Clean up code in comments (#403)
techouse Jan 9, 2023
a910ede
Fix dead link on FAQs page (#404)
markasselin Jan 26, 2023
adfb1c5
Updated chopper version to 6.0.0 for chopper_built_value (#406)
Guldem Feb 2, 2023
253d69a
#290 implement Equatable (#410)
techouse Feb 22, 2023
9976752
Add Feature request Github issue template (#414)
techouse Mar 13, 2023
617f3f3
:construction_worker: add CODEOWNERS (#415)
techouse Mar 29, 2023
d83ad40
:arrow_up: Bump Dart SDK constraint to ">=2.17.0 <4.0.0" (#417)
techouse May 12, 2023
83f8c25
:green_heart: Fix CI publish (#419)
techouse May 13, 2023
64bd220
:green_heart: Fix CI publish credentials (#421)
techouse May 14, 2023
09774f1
:green_heart: Fix CI coverage reporting (#423)
techouse May 14, 2023
0145064
:construction_worker: only run CI publish / --dry-run when a package'…
techouse May 15, 2023
ef2fbf5
:green_heart: fix publish CI to run only on push (#425)
techouse May 15, 2023
08781c9
:green_heart: fix publish workflow (#427)
techouse May 20, 2023
485ef8f
Adding follow redirects to toHttpRequest (#430)
Joran-Dob May 26, 2023
a88aa3a
:arrow_up: update squadron example (#432)
techouse May 27, 2023
0546452
:arrow_up: update http constraint to ">=0.13.0 <2.0.0" (#431)
techouse May 27, 2023
ae8bff5
Add MultipartRequest log to CurlInterceptor (#435)
JosephNK May 27, 2023
d824ded
:green_heart: add cleanup step to publish workflow (#434)
techouse May 28, 2023
829d5b0
:twisted_rightwards_arrows: post release branch sync (#437)
techouse May 28, 2023
455cd34
:bug: fix Multipart for List<int> and List<String> (#439)
techouse Jun 3, 2023
1f8c596
:twisted_rightwards_arrows: post release branch sync (#441)
techouse Jun 4, 2023
917a463
:sparkles: Generating files in different directories (#444)
techouse Jun 19, 2023
ac90783
:twisted_rightwards_arrows: post release branch sync (#447)
techouse Jun 19, 2023
97959f0
:recycle: refactor chopper_generator (#448)
techouse Jul 4, 2023
0856b86
:twisted_rightwards_arrows: post release branch sync (#450)
techouse Jul 5, 2023
96f9dbc
:heavy_minus_sign: remove dart_code_metrics from dev_dependencies (#452)
techouse Jul 9, 2023
6afebb0
:sparkles: implement Dart 3 class modifiers (#453)
techouse Jul 29, 2023
93b4e8a
:twisted_rightwards_arrows: post release branch sync (#455)
techouse Jul 30, 2023
7cd824c
:passport_control: fix CODEOWNERS (#456)
techouse Jul 30, 2023
aa63283
:recycle: refactor chopper (#460)
techouse Aug 2, 2023
a386e86
:recycle: refactor ChopperClient constructor (#461)
techouse Aug 2, 2023
7a6b5b9
:arrow_up: update mono_repo (#462)
techouse Aug 2, 2023
e9fc26d
:sparkles: add final class modifier to generated Chopper API implemen…
techouse Aug 3, 2023
e07afcf
:twisted_rightwards_arrows: post release branch sync (#466)
techouse Aug 3, 2023
2f7f414
:construction_worker: add Dependabot workflow (#467)
techouse Aug 4, 2023
03f7bf7
:pencil2: fix typo in mono_repo.yaml (#468)
techouse Aug 4, 2023
8dbde76
:sparkles: HttpLoggingInterceptor: allow to pass custom logger (#470)
Maxr1998 Aug 5, 2023
2e00b6a
:construction_worker: use yq to manipulate pubspec.yaml in publish CI…
techouse Aug 7, 2023
0af17f8
:twisted_rightwards_arrows: post release branch sync (#473)
techouse Aug 7, 2023
1a01b60
:sparkles: Attach request/response to interceptor log lines (#475)
Maxr1998 Aug 10, 2023
764d57d
:twisted_rightwards_arrows: post release branch sync (#477)
techouse Aug 11, 2023
f8905ad
:adhesive_bandage: export ChopperLogRecord to library surface (#480)
Maxr1998 Aug 14, 2023
c658d39
:label: make ChopperLogRecord final (#481)
Maxr1998 Aug 14, 2023
a0d70ac
:twisted_rightwards_arrows: post release branch sync (#483)
techouse Aug 14, 2023
2ab9d87
:arrow_up: analyzer: ">=5.13.0 <7.0.0" (#484)
techouse Aug 16, 2023
08bab6c
:twisted_rightwards_arrows: post release branch sync (#486)
techouse Aug 17, 2023
4c52b09
Update README.md (#488)
hunterwilhelm Aug 19, 2023
c7b67a6
:twisted_rightwards_arrows: post release branch sync (#491)
techouse Aug 22, 2023
e706150
Adding support for top level variables (#493)
martinale14 Aug 31, 2023
31c3967
:label: add topics (#495)
techouse Sep 1, 2023
a0f106d
:bug: fix chopper base.dart send() authenticate sending wrong request…
techouse Sep 2, 2023
f85eacd
:twisted_rightwards_arrows: post release branch sync (#499)
techouse Sep 2, 2023
be71064
:rotating_light: ignore unnecessary_string_interpolations (#501)
techouse Sep 5, 2023
3ff8359
:twisted_rightwards_arrows: post release branch sync (#503)
techouse Sep 8, 2023
14bc48f
:rotating_light: correct static analysis suppression of *.chopper.dar…
techouse Oct 7, 2023
b48066d
:bug: remove charset from http request headers when the body is in by…
techouse Oct 7, 2023
cbb4a92
:construction_worker: update mono_repo (#509)
techouse Oct 7, 2023
ce0836d
:construction_worker: create Github release when publishing package (…
techouse Oct 7, 2023
fedb899
:twisted_rightwards_arrows: post release branch sync (#514)
techouse Oct 7, 2023
52133f6
:sparkles: encode DateTime as ISO8601 (#516)
techouse Oct 11, 2023
24179ab
:twisted_rightwards_arrows: post release branch sync (#518)
techouse Oct 11, 2023
4860d3a
Fix incorrect url generation when using new baseurl (#520)
martinale14 Oct 12, 2023
8dd5a84
:twisted_rightwards_arrows: post release branch sync (#522)
techouse Oct 13, 2023
08ee151
:arrow_up: Bump lints from 2.1.1 to 3.0.0 in /chopper (#525)
dependabot[bot] Oct 23, 2023
723b5fc
:arrow_up: Bump lints from 2.1.1 to 3.0.0 in /chopper_built_value (#524)
dependabot[bot] Oct 23, 2023
f061355
:arrow_up: Bump lints from 2.1.1 to 3.0.0 in /chopper_generator (#523)
dependabot[bot] Oct 23, 2023
e5417d1
Add mock mixins of Chopper components. (#529)
diegotori Oct 26, 2023
e34feea
Add success/failure callback hooks to Authenticator. (#527)
diegotori Oct 26, 2023
4178d7d
:bug: fix Makefile show_test_coverage (#530)
techouse Oct 29, 2023
9d392a1
:twisted_rightwards_arrows: post release branch sync (#532)
techouse Nov 1, 2023
eb3f6c9
:lipstick: cosmetic refactor (#534)
techouse Nov 16, 2023
33cb73a
:construction_worker: update CI (#535)
techouse Nov 18, 2023
e84d077
:sparkles: call .toString() on non-String headers (#538)
techouse Dec 30, 2023
8938d98
:twisted_rightwards_arrows: post release branch sync (#542)
techouse Jan 2, 2024
4ba5a83
Helper function for fetching errors of specific type (#543)
Guldem Jan 2, 2024
6420778
:sparkles: Feature: Omit Response in service (#545)
Guldem Jan 5, 2024
2dc868f
:memo: Improved documentation + added const annotations (#548)
Guldem Jan 5, 2024
33615ed
:bug: fix chopper_generator regression introduced in #534 (#549)
techouse Jan 8, 2024
a0d5bc5
:twisted_rightwards_arrows: post release branch sync (#556)
techouse Jan 15, 2024
78fae30
:construction_worker: use Dependabot to check for workflow action upd…
techouse Jan 15, 2024
d369217
:sparkles: add option to override build_extension (#562)
techouse Jan 21, 2024
b8f2fe2
:twisted_rightwards_arrows: post release branch sync (#565)
techouse Jan 23, 2024
168982f
:rewind: revert faq.md (#566)
techouse Jan 24, 2024
be1c370
:sparkles: Added Target annotations for the annotations (#567)
Guldem Jan 25, 2024
63e6d00
:twisted_rightwards_arrows: post release branch sync (#569)
techouse Jan 28, 2024
5585ffb
:bug: Export ChopperHttpException so developer can catch it. (#570)
Guldem Jan 31, 2024
3af6e4e
:arrow_up: Bump codecov/codecov-action from 3 to 4 (#571)
dependabot[bot] Feb 5, 2024
4a1de44
Revert ":arrow_up: Bump codecov/codecov-action from 3 to 4 (#571)" (#…
techouse Feb 8, 2024
655aafa
Support @FormUrlEncoded (#579)
lwj1994 Mar 7, 2024
49943bf
:arrow_up: Bump actions/cache from 3.3.1 to 4.0.1 (#580)
dependabot[bot] Mar 7, 2024
8900256
:twisted_rightwards_arrows: post release branch sync (#582)
techouse Mar 8, 2024
8ff4ecd
:arrow_up: Bump softprops/action-gh-release from 1 to 2 (#583)
dependabot[bot] Mar 11, 2024
7c65a25
Support @Tag (#586)
lwj1994 Mar 20, 2024
fd9747a
:arrow_up: Bump actions/checkout from 3.5.2 to 4.1.2 (#587)
dependabot[bot] Mar 20, 2024
153f13e
:bug: fix Request.copyWith lose tag param (#588)
lwj1994 Mar 21, 2024
5039e49
:arrow_up: Bump actions/cache from 4.0.1 to 4.0.2 (#590)
dependabot[bot] Mar 25, 2024
dd61ec1
:twisted_rightwards_arrows: post release branch sync (#593)
techouse Apr 4, 2024
84471e4
:zap: use qs_dart for query string encoding (#592)
techouse Apr 4, 2024
46e8c99
:arrow_up: update Github actions (#594)
techouse Apr 5, 2024
1e6a8ab
:twisted_rightwards_arrows: post release branch sync (#596)
techouse Apr 5, 2024
03f6769
:arrow_up: update cli_script to 1.0.0 (was 0.3.1) (#597)
techouse Apr 5, 2024
ab5a80f
:sparkles: Restructure interceptors (#547)
Guldem Apr 5, 2024
aaaa0dc
Merge remote-tracking branch 'refs/remotes/origin/develop' into relea…
techouse Apr 5, 2024
9033849
:twisted_rightwards_arrows: resolve merge conflicts
techouse Apr 5, 2024
0576657
:bookmark: pre-release v8.0.0-rc.1
techouse Apr 5, 2024
201a432
:poop: temporarily quote out chopper_generator from chopper's dev dep…
techouse Apr 5, 2024
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
4 changes: 4 additions & 0 deletions chopper/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 8.0.0-rc.1

- Restructure interceptors ([#547](https://github.com/lejard-h/chopper/pull/547))

## 7.4.0

- Use [qs_dart](https://pub.dev/packages/qs_dart) for query string encoding for query string encoding in order to support complex query objects ([#592](https://github.com/lejard-h/chopper/pull/592))
Expand Down
6 changes: 4 additions & 2 deletions chopper/lib/chopper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ export 'src/annotations.dart';
export 'src/authenticator.dart';
export 'src/base.dart';
export 'src/chopper_http_exception.dart';
export 'src/chopper_exception.dart';
export 'src/chopper_log_record.dart';
export 'src/constants.dart';
export 'src/extensions.dart';
export 'src/http_logging_interceptor.dart';
export 'src/interceptor.dart';
export 'src/chain/chain.dart';
export 'src/interceptors/interceptor.dart';
export 'src/converters.dart';
export 'src/list_format.dart';
export 'src/request.dart';
export 'src/response.dart';
Expand Down
2 changes: 1 addition & 1 deletion chopper/lib/src/annotations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ typedef ConvertRequest = FutureOr<Request> Function(Request request);

/// A function that should convert the body of a [Response] from the HTTP
/// representation to a Dart object.
typedef ConvertResponse<T> = FutureOr<Response> Function(Response response);
typedef ConvertResponse<T> = FutureOr<Response<T>> Function(Response response);

/// {@template FactoryConverter}
/// Defines custom [Converter] methods for a single network API endpoint.
Expand Down
2 changes: 1 addition & 1 deletion chopper/lib/src/authenticator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ abstract class Authenticator {
/// Returns a [Request] that includes credentials to satisfy
/// an authentication challenge received in [response], based on
/// the incoming [request] or optionally, the [originalRequest]
/// (which was not modified with any previous [RequestInterceptor]s).
/// (which was not modified with any previous [Interceptor]s).
///
/// Otherwise, return `null` if the challenge cannot be satisfied.
///
Expand Down
217 changes: 21 additions & 196 deletions chopper/lib/src/base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,15 @@ import 'dart:async';

import 'package:chopper/src/annotations.dart';
import 'package:chopper/src/authenticator.dart';
import 'package:chopper/src/chain/call.dart';
import 'package:chopper/src/constants.dart';
import 'package:chopper/src/interceptor.dart';
import 'package:chopper/src/converters.dart';
import 'package:chopper/src/interceptors/interceptor.dart';
import 'package:chopper/src/request.dart';
import 'package:chopper/src/response.dart';
import 'package:chopper/src/utils.dart';
import 'package:http/http.dart' as http;
import 'package:meta/meta.dart';

@visibleForTesting
const List<Type> allowedInterceptorsType = [
RequestInterceptor,
RequestInterceptorFunc,
ResponseInterceptor,
ResponseInterceptorFunc1,
ResponseInterceptorFunc2,
DynamicResponseInterceptorFunc,
];

/// ChopperClient is the main class of the Chopper API.
///
/// It manages registered services, encodes and decodes data, and intercepts
Expand All @@ -46,8 +37,7 @@ base class ChopperClient {
final ErrorConverter? errorConverter;

late final Map<Type, ChopperService> _services;
late final List _requestInterceptors;
late final List _responseInterceptors;
late final List<Interceptor> interceptors;
final StreamController<Request> _requestController =
StreamController<Request>.broadcast();
final StreamController<Response> _responseController =
Expand Down Expand Up @@ -79,11 +69,10 @@ base class ChopperClient {
/// );
/// ```
///
/// [RequestInterceptor]s and [ResponseInterceptor]s can be added to the client
/// [Interceptor]s can be added to the client
/// with the [interceptors] parameter.
///
/// See [RequestInterceptor], [ResponseInterceptor], [HttpLoggingInterceptor],
/// [HeadersInterceptor], [CurlInterceptor]
/// See [HttpLoggingInterceptor], [HeadersInterceptor], [CurlInterceptor]
///
/// ```dart
/// final chopper = ChopperClient(
Expand Down Expand Up @@ -114,7 +103,7 @@ base class ChopperClient {
ChopperClient({
Uri? baseUrl,
http.Client? client,
Iterable? interceptors,
this.interceptors = const [],
this.authenticator,
this.converter,
this.errorConverter,
Expand All @@ -126,36 +115,13 @@ base class ChopperClient {
),
baseUrl = baseUrl ?? Uri(),
httpClient = client ?? http.Client(),
_clientIsInternal = client == null,
assert(
interceptors?.every(_isAnInterceptor) ?? true,
'Unsupported type for interceptors, it only support the following types:\n'
' - ${allowedInterceptorsType.join('\n - ')}',
),
_requestInterceptors = [
...?interceptors?.where(_isRequestInterceptor),
],
_responseInterceptors = [
...?interceptors?.where(_isResponseInterceptor),
] {
_clientIsInternal = client == null {
_services = <Type, ChopperService>{
for (final ChopperService service in services?.toSet() ?? [])
service.definitionType: service..client = this
};
}

static bool _isRequestInterceptor(value) =>
value is RequestInterceptor || value is RequestInterceptorFunc;

static bool _isResponseInterceptor(value) =>
value is ResponseInterceptor ||
value is ResponseInterceptorFunc1 ||
value is ResponseInterceptorFunc2 ||
value is DynamicResponseInterceptorFunc;

static bool _isAnInterceptor(value) =>
_isResponseInterceptor(value) || _isRequestInterceptor(value);

/// Retrieve any service included in the [ChopperClient]
///
/// ```dart
Expand Down Expand Up @@ -183,100 +149,6 @@ base class ChopperClient {
return service as ServiceType;
}

Future<Request> _encodeRequest(Request request) async =>
converter?.convertRequest(request) ?? request;

static Future<Response<BodyType>> _decodeResponse<BodyType, InnerType>(
Response response,
Converter withConverter,
) async =>
await withConverter.convertResponse<BodyType, InnerType>(response);

Future<Request> _interceptRequest(Request req) async {
final body = req.body;
for (final i in _requestInterceptors) {
if (i is RequestInterceptor) {
req = await i.onRequest(req);
} else if (i is RequestInterceptorFunc) {
req = await i(req);
}
}

assert(
body == req.body,
'Interceptors should not transform the body of the request'
'Use Request converter instead',
);

return req;
}

Future<Response<BodyType>> _interceptResponse<BodyType, InnerType>(
Response<BodyType> res,
) async {
final body = res.body;
for (final i in _responseInterceptors) {
if (i is ResponseInterceptor) {
res = await i.onResponse(res) as Response<BodyType>;
} else if (i is ResponseInterceptorFunc1) {
res = await i<BodyType>(res);
} else if (i is ResponseInterceptorFunc2) {
res = await i<BodyType, InnerType>(res);
} else if (i is DynamicResponseInterceptorFunc) {
res = await i(res) as Response<BodyType>;
}
}

assert(
body == res.body,
'Interceptors should not transform the body of the response'
'Use Response converter instead',
);

return res;
}

Future<Response<BodyType>> _handleErrorResponse<BodyType, InnerType>(
Response response,
) async {
var error = response.body;
if (errorConverter != null) {
final errorRes = await errorConverter?.convertError<BodyType, InnerType>(
response,
);
error = errorRes?.error ?? errorRes?.body;
}

return Response<BodyType>(response.base, null, error: error);
}

Future<Response<BodyType>> _handleSuccessResponse<BodyType, InnerType>(
Response response,
ConvertResponse? responseConverter,
) async {
if (responseConverter != null) {
response = await responseConverter(response);
} else if (converter != null) {
response =
await _decodeResponse<BodyType, InnerType>(response, converter!);
}

return Response<BodyType>(
response.base,
response.body,
);
}

Future<Request> _handleRequestConverter(
Request request,
ConvertRequest? requestConverter,
) async =>
request.body != null || request.parts.isNotEmpty
? requestConverter != null
? await requestConverter(request)
: await _encodeRequest(request)
: request;

/// Sends a pre-build [Request], applying all provided [Interceptor]s and
/// [Converter]s.
///
Expand All @@ -292,63 +164,22 @@ base class ChopperClient {
Future<Response<BodyType>> send<BodyType, InnerType>(
Request request, {
ConvertRequest? requestConverter,
ConvertResponse? responseConverter,
ConvertResponse<BodyType>? responseConverter,
}) async {
final Request req = await _interceptRequest(
await _handleRequestConverter(request, requestConverter),
final call = Call(
request: request,
client: this,
requestCallback: _requestController.add,
);

_requestController.add(req);

final streamRes = await httpClient.send(await req.toBaseRequest());
if (isTypeOf<BodyType, Stream<List<int>>>()) {
return Response(streamRes, (streamRes.stream) as BodyType);
}

final response = await http.Response.fromStream(streamRes);
dynamic res = Response(response, response.body);

if (authenticator != null) {
final Request? updatedRequest =
await authenticator!.authenticate(req, res, request);

if (updatedRequest != null) {
res = await send<BodyType, InnerType>(
updatedRequest,
requestConverter: requestConverter,
responseConverter: responseConverter,
);
// To prevent double call with typed response
if (_responseIsSuccessful(res.statusCode)) {
await authenticator!.onAuthenticationSuccessful
?.call(updatedRequest, res, request);
return _processResponse(res);
} else {
res = await _handleErrorResponse<BodyType, InnerType>(res);
await authenticator!.onAuthenticationFailed
?.call(updatedRequest, res, request);
return _processResponse(res);
}
}
}

res = _responseIsSuccessful(res.statusCode)
? await _handleSuccessResponse<BodyType, InnerType>(
res,
responseConverter,
)
: await _handleErrorResponse<BodyType, InnerType>(res);

return _processResponse(res);
}
final response = await call.execute<BodyType, InnerType>(
requestConverter,
responseConverter,
);

Future<Response<BodyType>> _processResponse<BodyType, InnerType>(
dynamic res,
) async {
res = await _interceptResponse<BodyType, InnerType>(res);
_responseController.add(res);
_responseController.add(response);

return res;
return response;
}

/// Makes a HTTP GET request using the [send] function.
Expand Down Expand Up @@ -501,20 +332,17 @@ base class ChopperClient {
_responseController.close();
_services.clear();

_requestInterceptors.clear();
_responseInterceptors.clear();

if (_clientIsInternal) {
httpClient.close();
}
}

/// A stream of processed [Request]s, as in after all [Converter]s, and
/// [RequestInterceptor]s have been run.
/// [Interceptor]s have been run.
Stream<Request> get onRequest => _requestController.stream;

/// A stream of processed [Response]s, as in after all [Converter]s and
/// [ResponseInterceptor]s have been run.
/// [Interceptor]s have been run.
Stream<Response> get onResponse => _responseController.stream;
}

Expand Down Expand Up @@ -548,6 +376,3 @@ abstract class ChopperService {
// TODO: use runtimeType
Type get definitionType;
}

bool _responseIsSuccessful(int statusCode) =>
statusCode >= 200 && statusCode < 300;
Loading
Loading