Jonny Borges
Committed by GitHub

Merge pull request #1438 from KevinZhang19870314/master

fix: #1428
@@ -192,38 +192,39 @@ class GetHttpClient { @@ -192,38 +192,39 @@ class GetHttpClient {
192 }); 192 });
193 193
194 if (authenticate) await _modifier.authenticator!(request); 194 if (authenticate) await _modifier.authenticator!(request);
195 - await _modifier.modifyRequest(request); 195 + final newRequest = await _modifier.modifyRequest<T>(request);
196 196
197 - var response = await _httpClient.send<T>(request); 197 + var response = await _httpClient.send<T>(newRequest);
198 198
199 - await _modifier.modifyResponse(request, response); 199 + final newResponse =
  200 + await _modifier.modifyResponse<T>(newRequest, response);
200 201
201 - if (HttpStatus.unauthorized == response.statusCode && 202 + if (HttpStatus.unauthorized == newResponse.statusCode &&
202 _modifier.authenticator != null && 203 _modifier.authenticator != null &&
203 requestNumber <= maxAuthRetries) { 204 requestNumber <= maxAuthRetries) {
204 return _performRequest<T>( 205 return _performRequest<T>(
205 handler, 206 handler,
206 authenticate: true, 207 authenticate: true,
207 requestNumber: requestNumber + 1, 208 requestNumber: requestNumber + 1,
208 - headers: request.headers, 209 + headers: newRequest.headers,
209 ); 210 );
210 - } else if (HttpStatus.unauthorized == response.statusCode) { 211 + } else if (HttpStatus.unauthorized == newResponse.statusCode) {
211 if (!errorSafety) { 212 if (!errorSafety) {
212 throw UnauthorizedException(); 213 throw UnauthorizedException();
213 } else { 214 } else {
214 return Response<T>( 215 return Response<T>(
215 - request: request,  
216 - headers: response.headers,  
217 - statusCode: response.statusCode,  
218 - body: response.body,  
219 - bodyBytes: response.bodyBytes,  
220 - bodyString: response.bodyString,  
221 - statusText: response.statusText, 216 + request: newRequest,
  217 + headers: newResponse.headers,
  218 + statusCode: newResponse.statusCode,
  219 + body: newResponse.body,
  220 + bodyBytes: newResponse.bodyBytes,
  221 + bodyString: newResponse.bodyString,
  222 + statusText: newResponse.statusText,
222 ); 223 );
223 } 224 }
224 } 225 }
225 226
226 - return response; 227 + return newResponse;
227 } on Exception catch (err) { 228 } on Exception catch (err) {
228 if (!errorSafety) { 229 if (!errorSafety) {
229 throw GetHttpException(err.toString()); 230 throw GetHttpException(err.toString());
@@ -31,19 +31,26 @@ class GetModifier<T> { @@ -31,19 +31,26 @@ class GetModifier<T> {
31 _requestModifiers.remove(interceptor); 31 _requestModifiers.remove(interceptor);
32 } 32 }
33 33
34 - Future<void> modifyRequest(Request request) async { 34 + Future<Request<T>> modifyRequest<T>(Request<T> request) async {
  35 + var newRequest = request;
35 if (_requestModifiers.isNotEmpty) { 36 if (_requestModifiers.isNotEmpty) {
36 for (var interceptor in _requestModifiers) { 37 for (var interceptor in _requestModifiers) {
37 - await interceptor(request); 38 + newRequest = await interceptor(newRequest) as Request<T>;
38 } 39 }
39 } 40 }
  41 +
  42 + return newRequest;
40 } 43 }
41 44
42 - Future<void> modifyResponse(Request request, Response response) async { 45 + Future<Response<T>> modifyResponse<T>(
  46 + Request<T> request, Response<T> response) async {
  47 + var newResponse = response;
43 if (_responseModifiers.isNotEmpty) { 48 if (_responseModifiers.isNotEmpty) {
44 for (var interceptor in _responseModifiers) { 49 for (var interceptor in _responseModifiers) {
45 - await interceptor(request, response); 50 + newResponse = await interceptor(request, response) as Response<T>;
46 } 51 }
47 } 52 }
  53 +
  54 + return newResponse;
48 } 55 }
49 } 56 }
@@ -74,6 +74,42 @@ class Request<T> { @@ -74,6 +74,42 @@ class Request<T> {
74 decoder: decoder, 74 decoder: decoder,
75 ); 75 );
76 } 76 }
  77 +
  78 + Request copyWith({
  79 + Uri? url,
  80 + String? method,
  81 + Map<String, String>? headers,
  82 + Stream<List<int>>? bodyBytes,
  83 + bool followRedirects = true,
  84 + int maxRedirects = 4,
  85 + int? contentLength,
  86 + FormData? files,
  87 + bool persistentConnection = true,
  88 + Decoder<T>? decoder,
  89 + bool appendHeader = true,
  90 + }) {
  91 + if (followRedirects) {
  92 + assert(maxRedirects > 0);
  93 + }
  94 +
  95 + // If appendHeader is set to true, we will merge origin headers with that
  96 + if (appendHeader && headers != null) {
  97 + headers.addAll(this.headers);
  98 + }
  99 +
  100 + return Request._(
  101 + url: url ?? this.url,
  102 + method: method ?? this.method,
  103 + bodyBytes: bodyBytes ??= BodyBytesStream.fromBytes(const []),
  104 + headers: headers == null ? this.headers : Map.from(headers),
  105 + followRedirects: followRedirects,
  106 + maxRedirects: maxRedirects,
  107 + contentLength: contentLength,
  108 + files: files,
  109 + persistentConnection: persistentConnection,
  110 + decoder: decoder,
  111 + );
  112 + }
77 } 113 }
78 114
79 extension BodyBytesStream on Stream<List<int>> { 115 extension BodyBytesStream on Stream<List<int>> {