Committed by
GitHub
Merge pull request #1438 from KevinZhang19870314/master
fix: #1428
Showing
3 changed files
with
62 additions
and
18 deletions
@@ -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>> { |
-
Please register or login to post a comment