diff --git a/crates/sdk/src/api/http.rs b/crates/sdk/src/api/http.rs index 1650c284..84fd0829 100644 --- a/crates/sdk/src/api/http.rs +++ b/crates/sdk/src/api/http.rs @@ -65,6 +65,18 @@ impl HttpClient { } } + /// Validates the response status, reading the body into [`ApiSdkError::ApiError`] + /// on any other non-2xx status *before* it would otherwise be discarded. + async fn check_response(&self, response: reqwest::Response) -> ApiResult { + self.handle_response_status(&response)?; + if !response.status().is_success() { + let status = response.status().as_u16(); + let message = response.text().await.unwrap_or_default(); + return Err(ApiSdkError::ApiError { status, message }); + } + Ok(response) + } + pub async fn get(&self, endpoint: &str) -> ApiResult where T: DeserializeOwned, @@ -73,8 +85,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.get(&url).headers(headers).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json::().await?) } @@ -92,8 +103,7 @@ impl HttpClient { return Ok(None); } - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; let data = response.json::().await?; Ok(Some(data)) } @@ -112,8 +122,7 @@ impl HttpClient { } let response = request.send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json().await?) } @@ -126,8 +135,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.post(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json::().await?) } @@ -146,8 +154,7 @@ impl HttpClient { let headers = self.build_headers(Some(headers)); let response = self.client.post(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json::().await?) } @@ -160,8 +167,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.post(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - response.error_for_status()?; + self.check_response(response).await?; Ok(()) } @@ -175,8 +181,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.put(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json().await?) } @@ -195,8 +200,7 @@ impl HttpClient { let headers = self.build_headers(Some(headers)); let response = self.client.put(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json::().await?) } @@ -209,8 +213,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.put(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - response.error_for_status()?; + self.check_response(response).await?; Ok(()) } @@ -223,8 +226,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.delete(&url).headers(headers).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json().await?) } @@ -234,8 +236,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.delete(&url).headers(headers).send().await?; - self.handle_response_status(&response)?; - response.error_for_status()?; + self.check_response(response).await?; Ok(()) } @@ -249,8 +250,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.delete(&url).headers(headers).json(body).send().await?; - self.handle_response_status(&response)?; - let response = response.error_for_status()?; + let response = self.check_response(response).await?; Ok(response.json().await?) } @@ -260,8 +260,7 @@ impl HttpClient { let headers = self.build_headers(None); let response = self.client.get(&url).headers(headers).send().await?; - self.handle_response_status(&response)?; - response.error_for_status()?; + self.check_response(response).await?; Ok(()) } diff --git a/crates/sdk/src/api/types.rs b/crates/sdk/src/api/types.rs index ac1b2cfc..1c921b43 100644 --- a/crates/sdk/src/api/types.rs +++ b/crates/sdk/src/api/types.rs @@ -17,6 +17,9 @@ pub enum ApiSdkError { #[error("HTTP client error: {0}")] HttpError(#[from] reqwest::Error), + #[error("API error ({status}): {message}")] + ApiError { status: u16, message: String }, + #[error("Invalid configuration: {0}")] ConfigError(String),