prefetch-npm-deps: check response status and fail on error (#297863)
Check response status and fail if error returned.
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
use anyhow::bail;
|
||||
use backoff::{retry, ExponentialBackoff};
|
||||
use data_encoding::BASE64;
|
||||
use digest::Digest;
|
||||
@@ -5,6 +6,7 @@ use isahc::{
|
||||
config::{CaCertificate, Configurable, RedirectPolicy, SslOption},
|
||||
Body, Request, RequestExt,
|
||||
};
|
||||
use log::info;
|
||||
use nix_nar::{Encoder, NarError};
|
||||
use serde_json::{Map, Value};
|
||||
use sha2::Sha256;
|
||||
@@ -15,7 +17,7 @@ use std::{
|
||||
};
|
||||
use url::Url;
|
||||
|
||||
pub fn get_url(url: &Url) -> Result<Body, isahc::Error> {
|
||||
pub fn get_url(url: &Url) -> Result<Body, anyhow::Error> {
|
||||
let mut request = Request::get(url.as_str()).redirect_policy(RedirectPolicy::Limit(10));
|
||||
|
||||
// Respect SSL_CERT_FILE if environment variable exists
|
||||
@@ -37,16 +39,27 @@ pub fn get_url(url: &Url) -> Result<Body, isahc::Error> {
|
||||
if let Ok(npm_tokens) = env::var("NIX_NPM_TOKENS") {
|
||||
if let Ok(tokens) = serde_json::from_str::<Map<String, Value>>(&npm_tokens) {
|
||||
if let Some(token) = tokens.get(host).and_then(serde_json::Value::as_str) {
|
||||
info!("Found NPM token for {}. Adding authorization header to request.", host);
|
||||
request = request.header("Authorization", format!("Bearer {token}"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(request.body(())?.send()?.into_body())
|
||||
let res = request.body(())?.send()?;
|
||||
if !res.status().is_success() {
|
||||
if res.status().is_client_error() {
|
||||
bail!("Client error: {}", res.status());
|
||||
}
|
||||
if res.status().is_server_error() {
|
||||
bail!("Server error: {}", res.status());
|
||||
}
|
||||
bail!("{}", res.status());
|
||||
}
|
||||
Ok(res.into_body())
|
||||
}
|
||||
|
||||
pub fn get_url_body_with_retry(url: &Url) -> Result<Vec<u8>, isahc::Error> {
|
||||
pub fn get_url_body_with_retry(url: &Url) -> Result<Vec<u8>, anyhow::Error> {
|
||||
retry(ExponentialBackoff::default(), || {
|
||||
get_url(url)
|
||||
.and_then(|mut body| {
|
||||
@@ -56,12 +69,15 @@ pub fn get_url_body_with_retry(url: &Url) -> Result<Vec<u8>, isahc::Error> {
|
||||
|
||||
Ok(buf)
|
||||
})
|
||||
.map_err(|err| {
|
||||
if err.is_network() || err.is_timeout() {
|
||||
backoff::Error::transient(err)
|
||||
} else {
|
||||
backoff::Error::permanent(err)
|
||||
.map_err(|err| match err.downcast_ref::<isahc::Error>() {
|
||||
Some(isahc_err) => {
|
||||
if isahc_err.is_network() || isahc_err.is_timeout() {
|
||||
backoff::Error::transient(err)
|
||||
} else {
|
||||
backoff::Error::permanent(err)
|
||||
}
|
||||
}
|
||||
None => backoff::Error::permanent(err),
|
||||
})
|
||||
})
|
||||
.map_err(|backoff_err| match backoff_err {
|
||||
|
||||
Reference in New Issue
Block a user