kevin.zhang

fix: #1428

... ... @@ -192,11 +192,11 @@ class GetHttpClient {
});
if (authenticate) await _modifier.authenticator!(request);
await _modifier.modifyRequest(request);
final newRequest = await _modifier.modifyRequest<T>(request);
var response = await _httpClient.send<T>(request);
var response = await _httpClient.send<T>(newRequest);
await _modifier.modifyResponse(request, response);
await _modifier.modifyResponse(newRequest, response);
if (HttpStatus.unauthorized == response.statusCode &&
_modifier.authenticator != null &&
... ... @@ -205,14 +205,14 @@ class GetHttpClient {
handler,
authenticate: true,
requestNumber: requestNumber + 1,
headers: request.headers,
headers: newRequest.headers,
);
} else if (HttpStatus.unauthorized == response.statusCode) {
if (!errorSafety) {
throw UnauthorizedException();
} else {
return Response<T>(
request: request,
request: newRequest,
headers: response.headers,
statusCode: response.statusCode,
body: response.body,
... ...
... ... @@ -31,12 +31,15 @@ class GetModifier<T> {
_requestModifiers.remove(interceptor);
}
Future<void> modifyRequest(Request request) async {
Future<Request<T>> modifyRequest<T>(Request<T> request) async {
var newRequest = request;
if (_requestModifiers.isNotEmpty) {
for (var interceptor in _requestModifiers) {
await interceptor(request);
newRequest = await interceptor(newRequest) as Request<T>;
}
}
return newRequest;
}
Future<void> modifyResponse(Request request, Response response) async {
... ...
... ... @@ -74,6 +74,35 @@ class Request<T> {
decoder: decoder,
);
}
Request copyWith({
required Uri url,
required String method,
required Map<String, String> headers,
Stream<List<int>>? bodyBytes,
bool followRedirects = true,
int maxRedirects = 4,
int? contentLength,
FormData? files,
bool persistentConnection = true,
Decoder<T>? decoder,
}) {
if (followRedirects) {
assert(maxRedirects > 0);
}
return Request._(
url: url,
method: method,
bodyBytes: bodyBytes ??= BodyBytesStream.fromBytes(const []),
headers: Map.from(headers),
followRedirects: followRedirects,
maxRedirects: maxRedirects,
contentLength: contentLength,
files: files,
persistentConnection: persistentConnection,
decoder: decoder,
);
}
}
extension BodyBytesStream on Stream<List<int>> {
... ...