From 411a8c495c4e29411baff0af3218c5004bbe1bca Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Wed, 15 Apr 2015 20:31:15 -0700 Subject: [PATCH] Fix percent-encoded usernames and passwords Closes #113 --- src/url.rs | 6 +++--- tests/test.rs | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/url.rs b/src/url.rs index 1ce68997..1ef82732 100644 --- a/src/url.rs +++ b/src/url.rs @@ -309,13 +309,13 @@ fn get_authority(rawurl: &str) -> colon_count = 0; // reset count match st { State::Start => { - let user = rawurl[begin..i].to_string(); + let user = try!(decode_component(&rawurl[begin..i])); userinfo = Some(UserInfo::new(user, None)); st = State::InHost; } State::PassHostPort => { - let user = rawurl[begin..pos].to_string(); - let pass = rawurl[pos+1..i].to_string(); + let user = try!(decode_component(&rawurl[begin..pos])); + let pass = try!(decode_component(&rawurl[pos+1..i])); userinfo = Some(UserInfo::new(user, Some(pass))); st = State::InHost; } diff --git a/tests/test.rs b/tests/test.rs index 7aa5f52a..a5e381bf 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -17,6 +17,7 @@ use postgres::{HandleNotice, Error, ConnectError, DbError, + IntoConnectParams, VecStreamIterator}; use postgres::SqlState::{SyntaxError, QueryCanceled, @@ -936,3 +937,10 @@ fn test_get_opt_wrong_type() { Err(e) => panic!("unexpected error {}", e), } } + +#[test] +fn url_encoded_password() { + let params = "postgresql://username%7b%7c:password%7b%7c@localhost".into_connect_params().unwrap(); + assert_eq!("username{|", ¶ms.user.as_ref().unwrap().user[..]); + assert_eq!("password{|", ¶ms.user.as_ref().unwrap().password.as_ref().unwrap()[..]); +}