diff --git a/src/Jenssegers/Mongodb/Connection.php b/src/Jenssegers/Mongodb/Connection.php index 0ada56a86..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 @@ -150,18 +151,43 @@ 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_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}"; + } + + /** + * 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 +204,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 */