send method
Sends an HTTP request and asynchronously returns the response.
Implementers should call BaseRequest.finalize
to get the body of the
request as a ByteStream
. They shouldn't make any assumptions about the
state of the stream; it could have data written to it asynchronously at a
later point, or it could already be closed when it's returned. Any
internal HTTP errors should be wrapped as ClientException
s.
Implementation
@override
Future<http.StreamedResponse> send(http.BaseRequest request) async {
if (_auth.isReady()) {
request.headers[utils.HttpConstants.headerAuthorization] =
_auth.getAuthString(request.method, request.url);
}
final response = await _inner.send(request);
if (response.statusCode == 401) {
final newRequest = utils.copyRequest(request);
final authInfo =
response.headers[utils.HttpConstants.headerWwwAuthenticate]!;
_auth.initFromAuthenticateHeader(authInfo);
newRequest.headers[utils.HttpConstants.headerAuthorization] =
_auth.getAuthString(newRequest.method, newRequest.url);
return _inner.send(newRequest);
}
// we should reach this point only with errors other than 401
return response;
}