Skip to content

Commit a0b9067

Browse files
authored
fix azure_storage_queue set_blob_service_properties (#1498)
1 parent 588f415 commit a0b9067

File tree

7 files changed

+59
-7
lines changed

7 files changed

+59
-7
lines changed

sdk/core/src/xml.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::error::{ErrorKind, ResultExt};
22
pub use quick_xml::serde_helpers::text_content;
33
use quick_xml::{
44
de::{from_reader, from_str},
5-
se::to_string,
5+
se::{to_string, to_string_with_root},
66
};
77
use serde::de::DeserializeOwned;
88

@@ -42,6 +42,16 @@ where
4242
})
4343
}
4444

45+
pub fn to_xml_with_root<T>(root_tag: &str, value: &T) -> crate::Result<String>
46+
where
47+
T: serde::Serialize,
48+
{
49+
to_string_with_root(root_tag, value).with_context(ErrorKind::DataConversion, || {
50+
let t = core::any::type_name::<T>();
51+
format!("failed to serialize {t} into xml")
52+
})
53+
}
54+
4555
/// Returns bytes without the UTF-8 BOM.
4656
fn slice_bom(bytes: &[u8]) -> &[u8] {
4757
if bytes.len() > 3 && bytes[0..3] == UTF8_BOM {

sdk/storage_queues/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ uuid = { version = "1.0", features = ["v4"] }
2626
[dev-dependencies]
2727
tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }
2828
uuid = { version = "1.0", features = ["v4"] }
29+
env_logger = "0.10"
2930

3031
[features]
31-
default = ["enable_reqwest"]
32+
default = ["enable_reqwest", "hmac_rust"]
3233
test_e2e = []
3334
enable_reqwest = ["azure_core/enable_reqwest", "azure_storage/enable_reqwest"]
3435
enable_reqwest_rustls = ["azure_core/enable_reqwest_rustls", "azure_storage/enable_reqwest_rustls"]
3536
test_integration = []
37+
hmac_openssl = ["azure_core/hmac_openssl"]
38+
hmac_rust = ["azure_core/hmac_rust"]
3639

3740
[package.metadata.docs.rs]
3841
features = ["enable_reqwest", "enable_reqwest_rustls", "hmac_rust", "hmac_openssl"]
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use azure_storage::prelude::*;
2+
use azure_storage_queues::{prelude::*, CorsRule};
3+
4+
#[tokio::main]
5+
async fn main() -> azure_core::Result<()> {
6+
env_logger::init();
7+
8+
// First we retrieve the account name and access key from environment variables.
9+
let account =
10+
std::env::var("STORAGE_ACCOUNT").expect("Set env variable STORAGE_ACCOUNT first!");
11+
let access_key =
12+
std::env::var("STORAGE_ACCESS_KEY").expect("Set env variable STORAGE_ACCESS_KEY first!");
13+
14+
let storage_credentials = StorageCredentials::access_key(account.clone(), access_key);
15+
let queue_service = QueueServiceClient::new(account, storage_credentials);
16+
let properties = queue_service.get_queue_service_properties().await?;
17+
println!("properties: {properties:#?}");
18+
19+
let mut properties = properties.queue_service_properties;
20+
properties.cors.cors_rule = Some(vec![CorsRule {
21+
allowed_origins: "http://www.contoso.com,http://www.fabrikam.com".to_owned(),
22+
allowed_methods: "GET,PUT".to_owned(),
23+
allowed_headers: "x-ms-meta-abc,x-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz".to_owned(),
24+
exposed_headers: "".to_owned(),
25+
max_age_in_seconds: 50000,
26+
}]);
27+
28+
queue_service
29+
.set_queue_service_properties(properties.clone())
30+
.await?;
31+
let properties = queue_service.get_queue_service_properties().await?;
32+
println!("properties: {properties:#?}");
33+
34+
Ok(())
35+
}

sdk/storage_queues/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ pub use clients::*;
5858
pub use message_ttl::MessageTTL;
5959
pub use number_of_messages::NumberOfMessages;
6060
pub use pop_receipt::PopReceipt;
61-
pub use queue_service_properties::QueueServiceProperties;
61+
pub use queue_service_properties::{CorsRule, QueueServiceProperties};
6262
pub use queue_stored_access_policy::QueueStoredAccessPolicy;
6363
pub use visibility_timeout::VisibilityTimeout;

sdk/storage_queues/src/operations/get_queue_service_properties.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ impl GetQueueServicePropertiesResponse {
3737
let (_, headers, body) = response.deconstruct();
3838
let body = body.collect().await?;
3939

40-
let queue_service_properties: QueueServiceProperties = read_xml(&body)?;
40+
let queue_service_properties = read_xml(&body)?;
4141

4242
Ok(GetQueueServicePropertiesResponse {
4343
common_storage_response_headers: (&headers).try_into()?,

sdk/storage_queues/src/operations/set_queue_service_properties.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::{QueueServiceClient, QueueServiceProperties};
2-
use azure_core::{error::Error, headers::Headers, xml::to_xml, Method, Response as AzureResponse};
2+
use azure_core::{
3+
error::Error, headers::Headers, xml::to_xml_with_root, Method, Response as AzureResponse,
4+
};
35
use azure_storage::headers::CommonStorageResponseHeaders;
46
use std::convert::TryInto;
57

@@ -17,7 +19,7 @@ impl SetQueueServicePropertiesBuilder {
1719
url.query_pairs_mut().append_pair("restype", "service");
1820
url.query_pairs_mut().append_pair("comp", "properties");
1921

20-
let xml_body = to_xml(&self.properties)?;
22+
let xml_body = to_xml_with_root("StorageServiceProperties", &self.properties)?;
2123

2224
let mut request = QueueServiceClient::finalize_request(
2325
url,

sdk/storage_queues/src/queue_service_properties.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub struct QueueServiceProperties {
1111
#[serde(rename_all = "PascalCase")]
1212
pub struct RetentionPolicy {
1313
pub enabled: bool,
14+
#[serde(skip_serializing_if = "Option::is_none")]
1415
pub days: Option<u64>,
1516
}
1617

@@ -29,14 +30,15 @@ pub struct Logging {
2930
pub struct Metrics {
3031
pub version: String,
3132
pub enabled: bool,
32-
#[serde(rename = "IncludeAPIs")]
33+
#[serde(rename = "IncludeAPIs", skip_serializing_if = "Option::is_none")]
3334
pub include_apis: Option<bool>,
3435
pub retention_policy: RetentionPolicy,
3536
}
3637

3738
#[derive(Debug, Clone, Serialize, Deserialize)]
3839
#[serde(rename_all = "PascalCase")]
3940
pub struct Cors {
41+
#[serde(skip_serializing_if = "Option::is_none")]
4042
pub cors_rule: Option<Vec<CorsRule>>,
4143
}
4244

0 commit comments

Comments
 (0)