@@ -268,18 +268,36 @@ func parseURIList(uriList []string, logger *logrus.Logger, splitCluster bool) []
268268 return URIs
269269}
270270
271+ // buildURIManually builds the URI manually by checking if the user and password are supplied
272+ func buildURIManually (uri string , user string , password string ) string {
273+ uriArray := strings .SplitN (uri , "://" , 2 )
274+ prefix := uriArray [0 ] + "://"
275+ uri = uriArray [1 ]
276+
277+ // IF user@pass not contained in uri AND custom user and pass supplied in arguments
278+ // DO concat a new uri with user and pass arguments value
279+ if ! strings .Contains (uri , "@" ) && user != "" && password != "" {
280+ // add user and pass to the uri
281+ uri = fmt .Sprintf ("%s:%s@%s" , user , password , uri )
282+ }
283+
284+ // add back prefix after adding the user and pass
285+ uri = prefix + uri
286+
287+ return uri
288+ }
289+
271290func buildURI (uri string , user string , password string , log * logrus.Logger ) string {
272291 defaultPrefix := "mongodb://" // default prefix
273- matchRegexp := regexp .MustCompile (`^mongodb(\+srv)?://` )
274292
275- // Split the uri defaultPrefix if there is any
276- if ! matchRegexp .MatchString (uri ) {
293+ if ! strings .HasPrefix (uri , defaultPrefix ) && ! strings .HasPrefix (uri , "mongodb+srv://" ) {
277294 uri = defaultPrefix + uri
278295 }
279296 parsedURI , err := url .Parse (uri )
280297 if err != nil {
281- log .Fatalf ("Failed to parse URI %s: %v" , uri , err )
282- return uri
298+ // PMM generates URI with escaped path to socket file, so url.Parse fails
299+ // in this case we build URI manually
300+ return buildURIManually (uri , user , password )
283301 }
284302
285303 if parsedURI .User == nil && user != "" && password != "" {
0 commit comments