From c3b622ab1d16fb7cd461c9ea3d87bf422b78112e Mon Sep 17 00:00:00 2001 From: Steve Porter Date: Fri, 5 Jan 2018 14:54:29 +0000 Subject: [PATCH 1/2] fix: fixes dsn connection strings by url encoding --- src/Jenssegers/Mongodb/Connection.php | 46 +++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index 0ada56a86..f111d760d 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -150,18 +150,37 @@ public function disconnect() } /** - * Create a DSN string from a configuration. + * Determine if the given configuration array has a UNIX socket value. * - * @param array $config + * @param array $config + * @return bool + */ + protected function hasDsnString(array $config) + { + return isset($config['dsn']) && ! empty($config['dsn']); + } + + /** + * Get the DSN string for a socket configuration. + * + * @param array $config * @return string */ - protected function getDsn(array $config) + protected function getDsnString(array $config) { - // Check if the user passed a complete dsn to the configuration. - if (!empty($config['dsn'])) { - return $config['dsn']; - } + $dsn = rawurlencode($config['dsn']); + + return "mongodb://{$dsn}"; + } + /** + * Get the DSN string for a host / port configuration. + * + * @param array $config + * @return string + */ + protected function getHostDsn(array $config) + { // Treat host option as array of hosts $hosts = is_array($config['host']) ? $config['host'] : [$config['host']]; @@ -178,6 +197,19 @@ protected function getDsn(array $config) return 'mongodb://' . implode(',', $hosts) . ($auth_database ? '/' . $auth_database : ''); } + /** + * Create a DSN string from a configuration. + * + * @param array $config + * @return string + */ + protected function getDsn(array $config) + { + return $this->hasDsnString($config) + ? $this->getDsnString($config) + : $this->getHostDsn($config); + } + /** * @inheritdoc */ From b1ed16676a8a578c0facdf21a1a011691949ec90 Mon Sep 17 00:00:00 2001 From: Steve Porter Date: Fri, 5 Jan 2018 15:03:10 +0000 Subject: [PATCH 2/2] refactor: support dsn strings with and without mongodb prefix --- src/Jenssegers/Mongodb/Connection.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index f111d760d..0cb28aa83 100644 --- a/src/Jenssegers/Mongodb/Connection.php +++ b/src/Jenssegers/Mongodb/Connection.php @@ -4,6 +4,7 @@ use Illuminate\Database\Connection as BaseConnection; use Illuminate\Support\Arr; +use Illuminate\Support\Str; use MongoDB\Client; class Connection extends BaseConnection @@ -168,9 +169,15 @@ protected function hasDsnString(array $config) */ protected function getDsnString(array $config) { - $dsn = rawurlencode($config['dsn']); - - return "mongodb://{$dsn}"; + $dsn_string = $config['dsn']; + + if ( Str::contains($dsn_string, 'mongodb://') ){ + $dsn_string = Str::replaceFirst('mongodb://', '', $dsn_string); + } + + $dsn_string = rawurlencode($dsn_string); + + return "mongodb://{$dsn_string}"; } /**