From 680594471527e4fa0e0bff5fb76348039584d3e6 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Thu, 6 Jul 2023 11:55:02 +0100 Subject: [PATCH] feat(crates-io): expose headers for `ResponseError::Api` In response to RFC 3231 [^1], our registry client need to return headers to caller, so that the caller (cargo binary) can continue parsing challenge headers. [^1]: https://rust-lang.github.io/rfcs/3231-cargo-asymmetric-tokens.html#the-authentication-process --- Cargo.lock | 2 +- Cargo.toml | 2 +- crates/crates-io/Cargo.toml | 2 +- crates/crates-io/lib.rs | 5 +++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee6bcaee3..07f6320a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -585,7 +585,7 @@ dependencies = [ [[package]] name = "crates-io" -version = "0.37.0" +version = "0.38.0" dependencies = [ "anyhow", "curl", diff --git a/Cargo.toml b/Cargo.toml index 63e06adb5..b924178a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ cargo-util = { version = "0.2.5", path = "crates/cargo-util" } cargo_metadata = "0.14.0" clap = "4.2.0" core-foundation = { version = "0.9.0", features = ["mac_os_10_7_support"] } -crates-io = { version = "0.37.0", path = "crates/crates-io" } +crates-io = { version = "0.38.0", path = "crates/crates-io" } criterion = { version = "0.5.1", features = ["html_reports"] } curl = "0.4.44" curl-sys = "0.4.63" diff --git a/crates/crates-io/Cargo.toml b/crates/crates-io/Cargo.toml index a82b1d126..9896a7f4f 100644 --- a/crates/crates-io/Cargo.toml +++ b/crates/crates-io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crates-io" -version = "0.37.0" +version = "0.38.0" edition.workspace = true license.workspace = true repository = "https://github.com/rust-lang/cargo" diff --git a/crates/crates-io/lib.rs b/crates/crates-io/lib.rs index 243808098..7e3d3361c 100644 --- a/crates/crates-io/lib.rs +++ b/crates/crates-io/lib.rs @@ -130,6 +130,7 @@ pub enum ResponseError { Curl(curl::Error), Api { code: u32, + headers: Vec, errors: Vec, }, Code { @@ -155,7 +156,7 @@ impl fmt::Display for ResponseError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { ResponseError::Curl(e) => write!(f, "{}", e), - ResponseError::Api { code, errors } => { + ResponseError::Api { code, errors, .. } => { f.write_str("the remote server responded with an error")?; if *code != 200 { write!(f, " (status {} {})", code, reason(*code))?; @@ -447,7 +448,7 @@ impl Registry { match (self.handle.response_code()?, errors) { (0, None) | (200, None) => Ok(body), - (code, Some(errors)) => Err(ResponseError::Api { code, errors }), + (code, Some(errors)) => Err(ResponseError::Api { code, headers, errors }), (code, None) => Err(ResponseError::Code { code, headers,