diff --git a/sdk/cosmos/azure_data_cosmos/src/clients/container_client.rs b/sdk/cosmos/azure_data_cosmos/src/clients/container_client.rs index a4c9174487..fc37ffa747 100644 --- a/sdk/cosmos/azure_data_cosmos/src/clients/container_client.rs +++ b/sdk/cosmos/azure_data_cosmos/src/clients/container_client.rs @@ -490,7 +490,11 @@ impl ContainerClient { item_id: &str, options: Option>, ) -> azure_core::Result> { - let options = options.unwrap_or_default(); + let mut options = options.unwrap_or_default(); + + // Read APIs should always return the item, ignoring whatever the user set. + options.enable_content_response_on_write = true; + let link = self.items_link.item(item_id); let url = self.pipeline.url(&link); let mut req = Request::new(url, Method::Get); diff --git a/sdk/cosmos/azure_data_cosmos/src/pipeline/mod.rs b/sdk/cosmos/azure_data_cosmos/src/pipeline/mod.rs index 45c5caaeca..79afbe58eb 100644 --- a/sdk/cosmos/azure_data_cosmos/src/pipeline/mod.rs +++ b/sdk/cosmos/azure_data_cosmos/src/pipeline/mod.rs @@ -7,10 +7,13 @@ mod signature_target; use std::sync::Arc; pub use authorization_policy::AuthorizationPolicy; -use azure_core::http::{ - request::{options::ContentType, Request}, - response::Response, - ClientOptions, Context, Method, PagerState, RawResponse, +use azure_core::{ + error::HttpError, + http::{ + request::{options::ContentType, Request}, + response::Response, + ClientOptions, Context, Method, PagerState, RawResponse, + }, }; use futures::TryStreamExt; use serde::de::DeserializeOwned; @@ -64,7 +67,7 @@ impl CosmosPipeline { resource_link: ResourceLink, ) -> azure_core::Result { let ctx = ctx.with_value(resource_link); - self.pipeline.send(&ctx, request).await + self.pipeline.send(&ctx, request).await?.success().await } pub async fn send( @@ -75,7 +78,7 @@ impl CosmosPipeline { ) -> azure_core::Result> { self.send_raw(ctx, request, resource_link) .await - .map(|r| r.into()) + .map(Into::into) } pub fn send_query_request( @@ -105,7 +108,7 @@ impl CosmosPipeline { req.insert_header(constants::CONTINUATION, continuation); } - let resp = pipeline.send(&ctx, &mut req).await?; + let resp = pipeline.send(&ctx, &mut req).await?.success().await?; let page = FeedPage::::from_response(resp).await?; Ok(page.into()) @@ -191,3 +194,39 @@ pub(crate) fn create_base_query_request(url: Url, query: &Query) -> azure_core:: request.set_json(query)?; Ok(request) } + +trait ResponseExt { + async fn success(self) -> azure_core::Result + where + Self: Sized; +} + +impl ResponseExt for Response { + async fn success(self) -> azure_core::Result { + if self.status().is_success() { + Ok(self) + } else { + RawResponse::from(self).success().await.map(Into::into) + } + } +} + +impl ResponseExt for RawResponse { + async fn success(self) -> azure_core::Result { + if self.status().is_success() { + Ok(self) + } else { + let http_error = HttpError::new(self).await; + let status = http_error.status(); + let error_kind = azure_core::error::ErrorKind::http_response( + status, + http_error.error_code().map(ToOwned::to_owned), + ); + Err(azure_core::Error::full( + error_kind, + http_error, + format!("Request failed with status code: {}", status), + )) + } + } +}