send method Null safety
- BaseRequest request
override
Sends an HTTP request with OAuth2 authorization credentials attached.
This will also automatically refresh this client's Credentials before sending the request if necessary.
Implementation
@override
Future<http.StreamedResponse> send(http.BaseRequest request) async {
if (credentials.isExpired) {
if (!credentials.canRefresh) throw ExpirationException(credentials);
await refreshCredentials();
}
request.headers['authorization'] = 'Bearer ${credentials.accessToken}';
var response = await _httpClient!.send(request);
if (response.statusCode != 401) return response;
if (!response.headers.containsKey('www-authenticate')) return response;
List<AuthenticationChallenge> challenges;
try {
challenges = AuthenticationChallenge.parseHeader(
response.headers['www-authenticate']!);
} on FormatException {
return response;
}
var challenge = challenges
.firstWhereOrNull((challenge) => challenge.scheme == 'bearer');
if (challenge == null) return response;
var params = challenge.parameters;
if (!params.containsKey('error')) return response;
throw AuthorizationException(params['error']!, params['error_description'],
params['error_uri'] == null ? null : Uri.parse(params['error_uri']!));
}