Skip to content

Commit e28cc0d

Browse files
committed
Parse more headers
1 parent 54afecd commit e28cc0d

File tree

4 files changed

+36
-52
lines changed

4 files changed

+36
-52
lines changed

sdk/core/src/models/etag.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use serde::{Deserialize, Serialize};
2-
use std::fmt;
2+
use std::{fmt, str::FromStr};
33

44
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
55
pub struct Etag(String);
@@ -19,6 +19,13 @@ impl AsRef<str> for Etag {
1919
}
2020
}
2121

22+
impl FromStr for Etag {
23+
type Err = crate::error::Error;
24+
fn from_str(s: &str) -> crate::Result<Self> {
25+
Ok(Self(s.into()))
26+
}
27+
}
28+
2229
impl fmt::Display for Etag {
2330
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2431
write!(f, "{}", self.0)

sdk/storage/src/core/headers/mod.rs

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::{ConsistencyCRC64, ConsistencyMD5};
2-
use azure_core::error::{Error, ErrorKind, ResultExt};
2+
use azure_core::error::Error;
33
use azure_core::headers::{
4-
self, client_request_id_from_headers_optional, date_from_headers, request_id_from_headers,
5-
server_from_headers, version_from_headers, HeaderName, Headers,
4+
client_request_id_from_headers_optional, date_from_headers, request_id_from_headers,
5+
server_from_headers, version_from_headers, HeaderName, Headers, CONTENT_MD5,
66
};
77
use azure_core::RequestId;
88
use chrono::{DateTime, Utc};
@@ -36,45 +36,23 @@ pub const COPY_ID: HeaderName = HeaderName::from_static("x-ms-copy-id");
3636
pub const RENAME_SOURCE: HeaderName = HeaderName::from_static("x-ms-rename-source");
3737

3838
pub fn content_crc64_from_headers(headers: &Headers) -> azure_core::Result<ConsistencyCRC64> {
39-
content_crc64_from_headers_optional(headers)?.ok_or_else(|| {
40-
Error::with_message(ErrorKind::DataConversion, || {
41-
format!("header not found: {:?}", CONTENT_CRC64)
42-
})
43-
})
39+
headers.get_as(&CONTENT_CRC64)
4440
}
4541

4642
pub fn content_crc64_from_headers_optional(
4743
headers: &Headers,
4844
) -> azure_core::Result<Option<ConsistencyCRC64>> {
49-
headers
50-
.get_optional_str(&CONTENT_CRC64)
51-
.map(|content_crc64| {
52-
ConsistencyCRC64::decode(content_crc64).with_context(ErrorKind::DataConversion, || {
53-
format!("failed to decode content_crc64 from headers: {content_crc64}")
54-
})
55-
})
56-
.transpose()
45+
headers.get_optional_as(&CONTENT_CRC64)
5746
}
5847

5948
pub fn content_md5_from_headers(headers: &Headers) -> azure_core::Result<ConsistencyMD5> {
60-
content_md5_from_headers_optional(headers)?.ok_or_else(|| {
61-
Error::with_message(ErrorKind::DataConversion, || {
62-
format!("header not found: {:?}", headers::CONTENT_MD5)
63-
})
64-
})
49+
headers.get_as(&CONTENT_MD5)
6550
}
6651

6752
pub fn content_md5_from_headers_optional(
6853
headers: &Headers,
6954
) -> azure_core::Result<Option<ConsistencyMD5>> {
70-
headers
71-
.get_optional_str(&headers::CONTENT_MD5)
72-
.map(|content_md5| {
73-
ConsistencyMD5::decode(content_md5).with_context(ErrorKind::DataConversion, || {
74-
format!("failed to decode content_md5 from headers: {content_md5}")
75-
})
76-
})
77-
.transpose()
55+
headers.get_optional_as(&CONTENT_MD5)
7856
}
7957

8058
pub fn consistency_from_headers(

sdk/storage/src/core/mod.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ mod consistency {
5050
use azure_core::error::{Error, ErrorKind, ResultExt};
5151
use bytes::Bytes;
5252
use serde::{Deserialize, Deserializer};
53-
use std::convert::TryInto;
53+
use std::{convert::TryInto, str::FromStr};
5454

5555
#[derive(Debug, Clone, PartialEq)]
5656
pub struct ConsistencyCRC64(Bytes);
@@ -99,13 +99,19 @@ mod consistency {
9999
}
100100
}
101101

102+
impl FromStr for ConsistencyCRC64 {
103+
type Err = azure_core::error::Error;
104+
105+
fn from_str(s: &str) -> Result<Self, Self::Err> {
106+
Self::decode(s)
107+
}
108+
}
109+
102110
#[derive(Debug, Clone, PartialEq)]
103111
pub struct ConsistencyMD5(Bytes);
104112

105113
const MD5_BYTE_LENGTH: usize = 16;
106114

107-
impl ConsistencyMD5 {}
108-
109115
impl ConsistencyMD5 {
110116
/// Decodes from base64 encoded input
111117
pub fn decode(input: impl AsRef<[u8]>) -> azure_core::Result<Self> {
@@ -146,6 +152,14 @@ mod consistency {
146152
}
147153
}
148154

155+
impl FromStr for ConsistencyMD5 {
156+
type Err = azure_core::error::Error;
157+
158+
fn from_str(s: &str) -> Result<Self, Self::Err> {
159+
Self::decode(s)
160+
}
161+
}
162+
149163
#[cfg(test)]
150164
mod test {
151165
use super::*;

sdk/storage_blobs/src/blob/mod.rs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -211,30 +211,15 @@ impl Blob {
211211
.to_string();
212212

213213
let content_length = h.get_as(&headers::CONTENT_LENGTH)?;
214-
215-
let last_modified = h.get_str(&headers::LAST_MODIFIED)?;
216-
let last_modified = from_azure_time(last_modified)?;
217-
218-
let etag = h.get_str(&headers::ETAG)?.into();
219-
214+
let last_modified = from_azure_time(h.get_str(&headers::LAST_MODIFIED)?)?;
215+
let etag = h.get_as(&headers::ETAG)?;
220216
let blob_sequence_number = h.get_optional_as(&headers::BLOB_SEQUENCE_NUMBER)?;
221217
let blob_type = h.get_as(&headers::BLOB_TYPE)?;
222218
let access_tier = h.get_optional_as(&headers::BLOB_ACCESS_TIER)?;
223219
let content_encoding = h.get_optional_string(&headers::CONTENT_ENCODING);
224220
let content_language = h.get_optional_string(&headers::CONTENT_LANGUAGE);
225-
226-
let content_md5 = h
227-
.get_optional_str(&headers::CONTENT_MD5)
228-
.map(|header| ConsistencyMD5::decode(header.as_bytes()))
229-
.transpose()
230-
.map_kind(ErrorKind::DataConversion)?;
231-
232-
let content_crc64 = h
233-
.get_optional_str(&azure_storage::headers::CONTENT_CRC64)
234-
.map(|header| ConsistencyCRC64::decode(header.as_bytes()))
235-
.transpose()
236-
.map_kind(ErrorKind::DataConversion)?;
237-
221+
let content_md5 = h.get_optional_as(&headers::CONTENT_MD5)?;
222+
let content_crc64 = h.get_optional_as(&azure_storage::headers::CONTENT_CRC64)?;
238223
let cache_control = h.get_optional_string(&headers::CACHE_CONTROL);
239224
let content_disposition = h.get_optional_string(&headers::CONTENT_DISPOSITION);
240225
let lease_status = h.get_as(&headers::LEASE_STATUS)?;

0 commit comments

Comments
 (0)