in lib/src/http.dart [172:232]
Future<http.StreamedResponse> send(http.BaseRequest request) async {
late http.StreamedResponse streamedResponse;
try {
streamedResponse = await _inner.send(request);
} on SocketException catch (error, stackTraceOrNull) {
// Work around issue 23008.
var stackTrace = stackTraceOrNull;
if (error.osError == null) rethrow;
// Handle error codes known to be related to DNS or SSL issues. While it
// is tempting to handle these error codes before retrying, saving time
// for the end-user, it is known that DNS lookups can fail intermittently
// in some cloud environments. Furthermore, since these error codes are
// platform-specific (undocumented) and essentially cargo-culted along
// skipping retries may lead to intermittent issues that could be fixed
// with a retry. Failing to retry intermittent issues is likely to cause
// customers to wrap pub in a retry loop which will not improve the
// end-user experience.
if (error.osError!.errorCode == 8 ||
error.osError!.errorCode == -2 ||
error.osError!.errorCode == -5 ||
error.osError!.errorCode == 11001 ||
error.osError!.errorCode == 11004) {
fail('Could not resolve URL "${request.url.origin}".', error,
stackTrace);
} else if (error.osError!.errorCode == -12276) {
fail(
'Unable to validate SSL certificate for '
'"${request.url.origin}".',
error,
stackTrace);
} else {
rethrow;
}
}
var status = streamedResponse.statusCode;
// 401 responses should be handled by the OAuth2 client. It's very
// unlikely that they'll be returned by non-OAuth2 requests. We also want
// to pass along 400 responses from the token endpoint.
var tokenRequest = streamedResponse.request!.url == oauth2.tokenEndpoint;
if (status < 400 || status == 401 || (status == 400 && tokenRequest)) {
return streamedResponse;
}
if (status == 406 && request.headers['Accept'] == pubApiHeaders['Accept']) {
fail('Pub ${sdk.version} is incompatible with the current version of '
'${request.url.host}.\n'
'Upgrade pub to the latest version and try again.');
}
if (status == 500 &&
(request.url.host == 'pub.dartlang.org' ||
request.url.host == 'storage.googleapis.com')) {
fail('HTTP error 500: Internal Server Error at ${request.url}.\n'
'This is likely a transient error. Please try again later.');
}
throw PubHttpException(await http.Response.fromStream(streamedResponse));
}