Showing
1 changed file
with
33 additions
and
3 deletions
1 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | import 'dart:convert'; | 2 | import 'dart:convert'; |
3 | +import 'dart:io'; | ||
3 | 4 | ||
4 | import '../src/certificates/certificates.dart'; | 5 | import '../src/certificates/certificates.dart'; |
5 | import '../src/exceptions/exceptions.dart'; | 6 | import '../src/exceptions/exceptions.dart'; |
@@ -17,6 +18,8 @@ typedef Decoder<T> = T Function(dynamic data); | @@ -17,6 +18,8 @@ typedef Decoder<T> = T Function(dynamic data); | ||
17 | 18 | ||
18 | typedef Progress = Function(double percent); | 19 | typedef Progress = Function(double percent); |
19 | 20 | ||
21 | +typedef ResponseInterceptor<T> = Future<Response<T>?> Function(Request<T> request, Type targetType, HttpClientResponse response); | ||
22 | + | ||
20 | class GetHttpClient { | 23 | class GetHttpClient { |
21 | String userAgent; | 24 | String userAgent; |
22 | String? baseUrl; | 25 | String? baseUrl; |
@@ -31,6 +34,7 @@ class GetHttpClient { | @@ -31,6 +34,7 @@ class GetHttpClient { | ||
31 | bool sendContentLength; | 34 | bool sendContentLength; |
32 | 35 | ||
33 | Decoder? defaultDecoder; | 36 | Decoder? defaultDecoder; |
37 | + ResponseInterceptor? defaultResponseInterceptor; | ||
34 | 38 | ||
35 | Duration timeout; | 39 | Duration timeout; |
36 | 40 | ||
@@ -101,6 +105,7 @@ class GetHttpClient { | @@ -101,6 +105,7 @@ class GetHttpClient { | ||
101 | String method, | 105 | String method, |
102 | Map<String, dynamic>? query, | 106 | Map<String, dynamic>? query, |
103 | Decoder<T>? decoder, | 107 | Decoder<T>? decoder, |
108 | + ResponseInterceptor<T>? responseInterceptor, | ||
104 | Progress? uploadProgress, | 109 | Progress? uploadProgress, |
105 | ) async { | 110 | ) async { |
106 | List<int>? bodyBytes; | 111 | List<int>? bodyBytes; |
@@ -113,7 +118,7 @@ class GetHttpClient { | @@ -113,7 +118,7 @@ class GetHttpClient { | ||
113 | 118 | ||
114 | if (body is FormData) { | 119 | if (body is FormData) { |
115 | bodyBytes = await body.toBytes(); | 120 | bodyBytes = await body.toBytes(); |
116 | - _setContentLenght(headers, bodyBytes.length); | 121 | + headers['content-length'] = bodyBytes.length.toString(); |
117 | headers['content-type'] = | 122 | headers['content-type'] = |
118 | 'multipart/form-data; boundary=${body.boundary}'; | 123 | 'multipart/form-data; boundary=${body.boundary}'; |
119 | } else if (contentType != null && | 124 | } else if (contentType != null && |
@@ -161,6 +166,7 @@ class GetHttpClient { | @@ -161,6 +166,7 @@ class GetHttpClient { | ||
161 | followRedirects: followRedirects, | 166 | followRedirects: followRedirects, |
162 | maxRedirects: maxRedirects, | 167 | maxRedirects: maxRedirects, |
163 | decoder: decoder, | 168 | decoder: decoder, |
169 | + responseInterceptor: responseInterceptor | ||
164 | ); | 170 | ); |
165 | } | 171 | } |
166 | 172 | ||
@@ -269,6 +275,7 @@ class GetHttpClient { | @@ -269,6 +275,7 @@ class GetHttpClient { | ||
269 | String? contentType, | 275 | String? contentType, |
270 | Map<String, dynamic>? query, | 276 | Map<String, dynamic>? query, |
271 | Decoder<T>? decoder, | 277 | Decoder<T>? decoder, |
278 | + ResponseInterceptor<T>? responseInterceptor, | ||
272 | ) { | 279 | ) { |
273 | final headers = <String, String>{}; | 280 | final headers = <String, String>{}; |
274 | _setSimpleHeaders(headers, contentType); | 281 | _setSimpleHeaders(headers, contentType); |
@@ -279,12 +286,21 @@ class GetHttpClient { | @@ -279,12 +286,21 @@ class GetHttpClient { | ||
279 | url: uri, | 286 | url: uri, |
280 | headers: headers, | 287 | headers: headers, |
281 | decoder: decoder ?? (defaultDecoder as Decoder<T>?), | 288 | decoder: decoder ?? (defaultDecoder as Decoder<T>?), |
289 | + responseInterceptor: _responseInterceptor(responseInterceptor), | ||
282 | contentLength: 0, | 290 | contentLength: 0, |
283 | followRedirects: followRedirects, | 291 | followRedirects: followRedirects, |
284 | maxRedirects: maxRedirects, | 292 | maxRedirects: maxRedirects, |
285 | )); | 293 | )); |
286 | } | 294 | } |
287 | 295 | ||
296 | + ResponseInterceptor<T>? _responseInterceptor<T>(ResponseInterceptor<T>? actual) { | ||
297 | + if(actual != null) return actual; | ||
298 | + final defaultInterceptor = defaultResponseInterceptor; | ||
299 | + return defaultInterceptor != null | ||
300 | + ? (request, targetType, response) async => await defaultInterceptor(request, targetType, response) as Response<T>? | ||
301 | + : null; | ||
302 | + } | ||
303 | + | ||
288 | Future<Request<T>> _request<T>( | 304 | Future<Request<T>> _request<T>( |
289 | String? url, | 305 | String? url, |
290 | String method, { | 306 | String method, { |
@@ -292,6 +308,7 @@ class GetHttpClient { | @@ -292,6 +308,7 @@ class GetHttpClient { | ||
292 | required dynamic body, | 308 | required dynamic body, |
293 | required Map<String, dynamic>? query, | 309 | required Map<String, dynamic>? query, |
294 | Decoder<T>? decoder, | 310 | Decoder<T>? decoder, |
311 | + ResponseInterceptor<T>? responseInterceptor, | ||
295 | required Progress? uploadProgress, | 312 | required Progress? uploadProgress, |
296 | }) { | 313 | }) { |
297 | return _requestWithBody<T>( | 314 | return _requestWithBody<T>( |
@@ -301,6 +318,7 @@ class GetHttpClient { | @@ -301,6 +318,7 @@ class GetHttpClient { | ||
301 | method, | 318 | method, |
302 | query, | 319 | query, |
303 | decoder ?? (defaultDecoder as Decoder<T>?), | 320 | decoder ?? (defaultDecoder as Decoder<T>?), |
321 | + _responseInterceptor(responseInterceptor), | ||
304 | uploadProgress, | 322 | uploadProgress, |
305 | ); | 323 | ); |
306 | } | 324 | } |
@@ -310,6 +328,7 @@ class GetHttpClient { | @@ -310,6 +328,7 @@ class GetHttpClient { | ||
310 | String? contentType, | 328 | String? contentType, |
311 | Map<String, dynamic>? query, | 329 | Map<String, dynamic>? query, |
312 | Decoder<T>? decoder, | 330 | Decoder<T>? decoder, |
331 | + ResponseInterceptor<T>? responseInterceptor, | ||
313 | ) { | 332 | ) { |
314 | final headers = <String, String>{}; | 333 | final headers = <String, String>{}; |
315 | _setSimpleHeaders(headers, contentType); | 334 | _setSimpleHeaders(headers, contentType); |
@@ -320,6 +339,7 @@ class GetHttpClient { | @@ -320,6 +339,7 @@ class GetHttpClient { | ||
320 | url: uri, | 339 | url: uri, |
321 | headers: headers, | 340 | headers: headers, |
322 | decoder: decoder ?? (defaultDecoder as Decoder<T>?), | 341 | decoder: decoder ?? (defaultDecoder as Decoder<T>?), |
342 | + responseInterceptor: _responseInterceptor(responseInterceptor), | ||
323 | ); | 343 | ); |
324 | } | 344 | } |
325 | 345 | ||
@@ -330,6 +350,7 @@ class GetHttpClient { | @@ -330,6 +350,7 @@ class GetHttpClient { | ||
330 | Map<String, String>? headers, | 350 | Map<String, String>? headers, |
331 | Map<String, dynamic>? query, | 351 | Map<String, dynamic>? query, |
332 | Decoder<T>? decoder, | 352 | Decoder<T>? decoder, |
353 | + ResponseInterceptor<T>? responseInterceptor, | ||
333 | Progress? uploadProgress, | 354 | Progress? uploadProgress, |
334 | // List<MultipartFile> files, | 355 | // List<MultipartFile> files, |
335 | }) async { | 356 | }) async { |
@@ -342,6 +363,7 @@ class GetHttpClient { | @@ -342,6 +363,7 @@ class GetHttpClient { | ||
342 | body: body, | 363 | body: body, |
343 | query: query, | 364 | query: query, |
344 | decoder: decoder, | 365 | decoder: decoder, |
366 | + responseInterceptor: responseInterceptor, | ||
345 | uploadProgress: uploadProgress, | 367 | uploadProgress: uploadProgress, |
346 | ), | 368 | ), |
347 | headers: headers, | 369 | headers: headers, |
@@ -364,6 +386,7 @@ class GetHttpClient { | @@ -364,6 +386,7 @@ class GetHttpClient { | ||
364 | Map<String, String>? headers, | 386 | Map<String, String>? headers, |
365 | Map<String, dynamic>? query, | 387 | Map<String, dynamic>? query, |
366 | Decoder<T>? decoder, | 388 | Decoder<T>? decoder, |
389 | + ResponseInterceptor<T>? responseInterceptor, | ||
367 | Progress? uploadProgress, | 390 | Progress? uploadProgress, |
368 | // List<MultipartFile> files, | 391 | // List<MultipartFile> files, |
369 | }) async { | 392 | }) async { |
@@ -376,6 +399,7 @@ class GetHttpClient { | @@ -376,6 +399,7 @@ class GetHttpClient { | ||
376 | body: body, | 399 | body: body, |
377 | query: query, | 400 | query: query, |
378 | decoder: decoder, | 401 | decoder: decoder, |
402 | + responseInterceptor: responseInterceptor, | ||
379 | uploadProgress: uploadProgress, | 403 | uploadProgress: uploadProgress, |
380 | ), | 404 | ), |
381 | headers: headers, | 405 | headers: headers, |
@@ -399,6 +423,7 @@ class GetHttpClient { | @@ -399,6 +423,7 @@ class GetHttpClient { | ||
399 | Map<String, String>? headers, | 423 | Map<String, String>? headers, |
400 | Map<String, dynamic>? query, | 424 | Map<String, dynamic>? query, |
401 | Decoder<T>? decoder, | 425 | Decoder<T>? decoder, |
426 | + ResponseInterceptor<T>? responseInterceptor, | ||
402 | Progress? uploadProgress, | 427 | Progress? uploadProgress, |
403 | }) async { | 428 | }) async { |
404 | try { | 429 | try { |
@@ -410,6 +435,7 @@ class GetHttpClient { | @@ -410,6 +435,7 @@ class GetHttpClient { | ||
410 | query: query, | 435 | query: query, |
411 | body: body, | 436 | body: body, |
412 | decoder: decoder, | 437 | decoder: decoder, |
438 | + responseInterceptor: responseInterceptor, | ||
413 | uploadProgress: uploadProgress, | 439 | uploadProgress: uploadProgress, |
414 | ), | 440 | ), |
415 | headers: headers, | 441 | headers: headers, |
@@ -432,6 +458,7 @@ class GetHttpClient { | @@ -432,6 +458,7 @@ class GetHttpClient { | ||
432 | Map<String, String>? headers, | 458 | Map<String, String>? headers, |
433 | Map<String, dynamic>? query, | 459 | Map<String, dynamic>? query, |
434 | Decoder<T>? decoder, | 460 | Decoder<T>? decoder, |
461 | + ResponseInterceptor<T>? responseInterceptor, | ||
435 | Progress? uploadProgress, | 462 | Progress? uploadProgress, |
436 | }) async { | 463 | }) async { |
437 | try { | 464 | try { |
@@ -443,6 +470,7 @@ class GetHttpClient { | @@ -443,6 +470,7 @@ class GetHttpClient { | ||
443 | query: query, | 470 | query: query, |
444 | body: body, | 471 | body: body, |
445 | decoder: decoder, | 472 | decoder: decoder, |
473 | + responseInterceptor: responseInterceptor, | ||
446 | uploadProgress: uploadProgress, | 474 | uploadProgress: uploadProgress, |
447 | ), | 475 | ), |
448 | headers: headers, | 476 | headers: headers, |
@@ -464,10 +492,11 @@ class GetHttpClient { | @@ -464,10 +492,11 @@ class GetHttpClient { | ||
464 | String? contentType, | 492 | String? contentType, |
465 | Map<String, dynamic>? query, | 493 | Map<String, dynamic>? query, |
466 | Decoder<T>? decoder, | 494 | Decoder<T>? decoder, |
495 | + ResponseInterceptor<T>? responseInterceptor, | ||
467 | }) async { | 496 | }) async { |
468 | try { | 497 | try { |
469 | var response = await _performRequest<T>( | 498 | var response = await _performRequest<T>( |
470 | - () => _get<T>(url, contentType, query, decoder), | 499 | + () => _get<T>(url, contentType, query, decoder, responseInterceptor), |
471 | headers: headers, | 500 | headers: headers, |
472 | ); | 501 | ); |
473 | return response; | 502 | return response; |
@@ -548,10 +577,11 @@ class GetHttpClient { | @@ -548,10 +577,11 @@ class GetHttpClient { | ||
548 | String? contentType, | 577 | String? contentType, |
549 | Map<String, dynamic>? query, | 578 | Map<String, dynamic>? query, |
550 | Decoder<T>? decoder, | 579 | Decoder<T>? decoder, |
580 | + ResponseInterceptor<T>? responseInterceptor | ||
551 | }) async { | 581 | }) async { |
552 | try { | 582 | try { |
553 | var response = await _performRequest<T>( | 583 | var response = await _performRequest<T>( |
554 | - () async => _delete<T>(url, contentType, query, decoder), | 584 | + () async => _delete<T>(url, contentType, query, decoder, responseInterceptor), |
555 | headers: headers, | 585 | headers: headers, |
556 | ); | 586 | ); |
557 | return response; | 587 | return response; |
-
Please register or login to post a comment