Skip to content

Commit 411a8c4

Browse files
committed
Fix percent-encoded usernames and passwords
Closes #113
1 parent 2eea62f commit 411a8c4

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

src/url.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,13 +309,13 @@ fn get_authority(rawurl: &str) ->
309309
colon_count = 0; // reset count
310310
match st {
311311
State::Start => {
312-
let user = rawurl[begin..i].to_string();
312+
let user = try!(decode_component(&rawurl[begin..i]));
313313
userinfo = Some(UserInfo::new(user, None));
314314
st = State::InHost;
315315
}
316316
State::PassHostPort => {
317-
let user = rawurl[begin..pos].to_string();
318-
let pass = rawurl[pos+1..i].to_string();
317+
let user = try!(decode_component(&rawurl[begin..pos]));
318+
let pass = try!(decode_component(&rawurl[pos+1..i]));
319319
userinfo = Some(UserInfo::new(user, Some(pass)));
320320
st = State::InHost;
321321
}

tests/test.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use postgres::{HandleNotice,
1717
Error,
1818
ConnectError,
1919
DbError,
20+
IntoConnectParams,
2021
VecStreamIterator};
2122
use postgres::SqlState::{SyntaxError,
2223
QueryCanceled,
@@ -936,3 +937,10 @@ fn test_get_opt_wrong_type() {
936937
Err(e) => panic!("unexpected error {}", e),
937938
}
938939
}
940+
941+
#[test]
942+
fn url_encoded_password() {
943+
let params = "postgresql://username%7b%7c:password%7b%7c@localhost".into_connect_params().unwrap();
944+
assert_eq!("username{|", &params.user.as_ref().unwrap().user[..]);
945+
assert_eq!("password{|", &params.user.as_ref().unwrap().password.as_ref().unwrap()[..]);
946+
}

0 commit comments

Comments
 (0)