From 86b7a7bda0abb361cda9e2976e87c26b599522e2 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Sat, 2 Dec 2023 16:18:28 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Use=20`StreamedRequest`=20?= =?UTF-8?q?for=20native=20request=20stream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/src/conversion_layer_adapter.dart | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/plugins/http_compatibility_layer/lib/src/conversion_layer_adapter.dart b/plugins/http_compatibility_layer/lib/src/conversion_layer_adapter.dart index 696fc3254..1b7306f7a 100644 --- a/plugins/http_compatibility_layer/lib/src/conversion_layer_adapter.dart +++ b/plugins/http_compatibility_layer/lib/src/conversion_layer_adapter.dart @@ -5,6 +5,10 @@ import 'dart:typed_data'; import 'package:dio/dio.dart'; import 'package:http/http.dart'; +const _kIsWeb = bool.hasEnvironment('dart.library.js_util') + ? bool.fromEnvironment('dart.library.js_util') + : identical(0, 0.0); + /// A conversion layer which translates Dio HTTP requests to /// [http](https://pub.dev/packages/http) compatible requests. /// This way there's no need to implement custom [HttpClientAdapter] @@ -42,18 +46,12 @@ class ConversionLayerAdapter implements HttpClientAdapter { RequestOptions options, Stream? requestStream, ) async { - final request = Request(options.method, options.uri); - request.headers.addAll( - Map.fromEntries( - options.headers.entries.map( - (e) => MapEntry(e.key, e.value.toString().trim()), - ), - ), - ); - request.followRedirects = options.followRedirects; - request.maxRedirects = options.maxRedirects; - - if (requestStream != null) { + final BaseRequest request; + if (_kIsWeb && requestStream != null) { + final normalRequest = request = Request( + options.method, + options.uri, + ); final completer = Completer(); final sink = ByteConversionSink.withCallback( (bytes) => completer.complete( @@ -67,9 +65,25 @@ class ConversionLayerAdapter implements HttpClientAdapter { cancelOnError: true, ); final bytes = await completer.future; - request.bodyBytes = bytes; + normalRequest.bodyBytes = bytes; + } else if (requestStream != null) { + final streamedRequest = request = StreamedRequest( + options.method, + options.uri, + ); + requestStream.listen(streamedRequest.sink.add); + } else { + request = Request(options.method, options.uri); } - + request.headers.addAll( + Map.fromEntries( + options.headers.entries.map( + (e) => MapEntry(e.key, e.value.toString().trim()), + ), + ), + ); + request.followRedirects = options.followRedirects; + request.maxRedirects = options.maxRedirects; return request; } }