From d97014f620fd1cb3d55312a640786f39bb64a56b Mon Sep 17 00:00:00 2001 From: Dana Marcuse Date: Thu, 17 Sep 2020 13:21:22 -0400 Subject: [PATCH] feat: correctly handle percent-encoded socket as host for postgres URI --- sqlx-core/src/postgres/options/parse.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/sqlx-core/src/postgres/options/parse.rs b/sqlx-core/src/postgres/options/parse.rs index a3272170..5c5cd71e 100644 --- a/sqlx-core/src/postgres/options/parse.rs +++ b/sqlx-core/src/postgres/options/parse.rs @@ -14,7 +14,11 @@ impl FromStr for PgConnectOptions { let mut options = Self::default(); if let Some(host) = url.host_str() { - options = options.host(host); + let host_decoded = percent_decode_str(host); + options = match host_decoded.clone().next() { + Some(b'/') => options.socket(&*host_decoded.decode_utf8().map_err(Error::config)?), + _ => options.host(host), + } } if let Some(port) = url.port() { @@ -174,3 +178,20 @@ fn it_parses_password_with_non_ascii_chars_correctly() { assert_eq!(Some("p@ssw0rd".into()), opts.password); } + +#[test] +fn it_parses_socket_correctly_percent_encoded() { + let uri = "postgres://%2Fvar%2Flib%2Fpostgres/database"; + let opts = PgConnectOptions::from_str(uri).unwrap(); + + assert_eq!(Some("/var/lib/postgres/".into()), opts.socket); +} +#[test] +fn it_parses_socket_correctly_with_username_percent_encoded() { + let uri = "postgres://some_user@%2Fvar%2Flib%2Fpostgres/database"; + let opts = PgConnectOptions::from_str(uri).unwrap(); + + assert_eq!("some_user", opts.username); + assert_eq!(Some("/var/lib/postgres/".into()), opts.socket); + assert_eq!(Some("database"), opts.database.as_deref()); +}