Skip to content

Commit c39c973

Browse files
Parse connection string by splitting on first = (#622)
* Parse connection string by splitting on first = Certain parameters may contain more than one = sign in the string, for example the SharedAccessSignature. This allows a connection string as follows: AccountName=guywald;SharedAccessSignature=se=2036-01-01&sp=acw&sv=2018-11-09&sr=c&sig=c2lnbmF0dXJlCg%3D%3D To be parsed correctly into its component pieces: AccountName: guywald SharedAccessSignature: AccountName=guywald;SharedAccessSignature=se=2036-01-01&sp=acw&sv=2018-11-09&sr=c&sig=c2lnbmF0dXJlCg%3D%3D Previously it would get truncated as: SharedAccessSignature: se * Make sure to trim the key/value before use
1 parent 9a8d3f8 commit c39c973

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

sdk/storage/src/core/connection_string.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,26 +104,25 @@ impl<'a> ConnectionString<'a> {
104104
.filter(|s| !s.chars().all(char::is_whitespace));
105105

106106
for kv_pair_str in kv_str_pairs {
107-
let mut kv = kv_pair_str.trim().split('=');
108-
let k = match kv.next() {
109-
Some(k) if k.chars().all(char::is_whitespace) => {
107+
let kv = kv_pair_str.trim().split_once('=');
108+
109+
let (k, v) = match kv {
110+
Some((k, _)) if (k.chars().all(char::is_whitespace) || k.trim() == "") => {
110111
return Err(ConnectionStringError::ParseError {
111112
msg: "No key found".to_owned(),
112113
})
113114
}
115+
Some((k, v)) if (v.chars().all(char::is_whitespace) || v.trim() == "") => {
116+
return Err(ConnectionStringError::MissingValue {
117+
key: k.trim().to_owned(),
118+
})
119+
}
120+
Some((k, v)) => (k.trim(), v.trim()),
114121
None => {
115122
return Err(ConnectionStringError::ParseError {
116-
msg: "No key found".to_owned(),
123+
msg: "No key/value found".to_owned(),
117124
})
118125
}
119-
Some(k) => k,
120-
};
121-
let v = match kv.next() {
122-
Some(v) if v.chars().all(char::is_whitespace) => {
123-
return Err(ConnectionStringError::MissingValue { key: k.to_owned() })
124-
}
125-
None => return Err(ConnectionStringError::MissingValue { key: k.to_owned() }),
126-
Some(v) => v,
127126
};
128127

129128
match k {
@@ -198,6 +197,14 @@ mod tests {
198197
ConnectionString::new("AccountName="),
199198
Err(ConnectionStringError::MissingValue { key }) if key == "AccountName"
200199
));
200+
assert!(matches!(
201+
ConnectionString::new("AccountName ="),
202+
Err(ConnectionStringError::MissingValue { key }) if key == "AccountName"
203+
));
204+
assert!(matches!(
205+
ConnectionString::new("MissingEquals"),
206+
Err(ConnectionStringError::ParseError { msg: _ })
207+
));
201208
assert!(matches!(
202209
ConnectionString::new("="),
203210
Err(ConnectionStringError::ParseError { msg: _ })
@@ -248,6 +255,23 @@ mod tests {
248255
..
249256
})
250257
));
258+
assert!(matches!(
259+
ConnectionString::new("AccountName=guywald;SharedAccessSignature=se=2036-01-01&sp=acw&sv=2018-11-09&sr=c&sig=c2lnbmF0dXJlCg%3D%3D"),
260+
Ok(ConnectionString {
261+
account_name: Some("guywald"),
262+
sas: Some("se=2036-01-01&sp=acw&sv=2018-11-09&sr=c&sig=c2lnbmF0dXJlCg%3D%3D"),
263+
..
264+
})
265+
));
266+
267+
assert!(matches!(
268+
ConnectionString::new("AccountName = guywald;SharedAccessSignature = se=2036-01-01&sp=acw&sv=2018-11-09&sr=c&sig=c2lnbmF0dXJlCg%3D%3D"),
269+
Ok(ConnectionString {
270+
account_name: Some("guywald"),
271+
sas: Some("se=2036-01-01&sp=acw&sv=2018-11-09&sr=c&sig=c2lnbmF0dXJlCg%3D%3D"),
272+
..
273+
})
274+
));
251275
}
252276

253277
#[test]

0 commit comments

Comments
 (0)