support uri with options #7
			
				
			
		
		
		
	
							
								
								
									
										22
									
								
								mongodb.go
								
								
								
								
							
							
						
						
									
										22
									
								
								mongodb.go
								
								
								
								
							| 
						 | 
					@ -3,6 +3,7 @@ package mongodb
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/logrusorgru/aurora"
 | 
						"github.com/logrusorgru/aurora"
 | 
				
			||||||
	"go.mongodb.org/mongo-driver/event"
 | 
						"go.mongodb.org/mongo-driver/event"
 | 
				
			||||||
| 
						 | 
					@ -48,7 +49,7 @@ func Connect(cfg Config) (*mongo.Database, error) {
 | 
				
			||||||
	connectOptions := options.ClientOptions{}
 | 
						connectOptions := options.ClientOptions{}
 | 
				
			||||||
	opts := cfg.Standalone
 | 
						opts := cfg.Standalone
 | 
				
			||||||
	// Set auth if existed
 | 
						// Set auth if existed
 | 
				
			||||||
	if opts.Username != "" && opts.Password != "" {
 | 
						if opts != nil && opts.Username != "" && opts.Password != "" {
 | 
				
			||||||
		connectOptions.Auth = &options.Credential{
 | 
							connectOptions.Auth = &options.Credential{
 | 
				
			||||||
			AuthMechanism: opts.AuthMechanism,
 | 
								AuthMechanism: opts.AuthMechanism,
 | 
				
			||||||
			AuthSource:    opts.AuthSource,
 | 
								AuthSource:    opts.AuthSource,
 | 
				
			||||||
| 
						 | 
					@ -87,8 +88,7 @@ func connectWithTLS(cfg Config) (*mongo.Database, error) {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pwd := base64DecodeToString(opts.CertKeyFilePassword)
 | 
						pwd := base64DecodeToString(opts.CertKeyFilePassword)
 | 
				
			||||||
	s := "%s/?tls=true&tlsCAFile=./%s&tlsCertificateKeyFile=./%s&tlsCertificateKeyFilePassword=%s&authMechanism=MONGODB-X509"
 | 
						uri := getURIWithTLS(cfg, caFile.Name(), certFile.Name(), pwd)
 | 
				
			||||||
	uri := fmt.Sprintf(s, cfg.Host, caFile.Name(), certFile.Name(), pwd)
 | 
					 | 
				
			||||||
	readPref := getReadPref(opts.ReadPreferenceMode)
 | 
						readPref := getReadPref(opts.ReadPreferenceMode)
 | 
				
			||||||
	clientOpts := options.Client().SetReadPreference(readPref).SetReplicaSet(opts.ReplSet).ApplyURI(uri)
 | 
						clientOpts := options.Client().SetReadPreference(readPref).SetReplicaSet(opts.ReplSet).ApplyURI(uri)
 | 
				
			||||||
	if cfg.Monitor != nil {
 | 
						if cfg.Monitor != nil {
 | 
				
			||||||
| 
						 | 
					@ -107,6 +107,22 @@ func connectWithTLS(cfg Config) (*mongo.Database, error) {
 | 
				
			||||||
	return db, err
 | 
						return db, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getURIWithTLS(cfg Config, caFilePath, certFilePath, pwd string) string {
 | 
				
			||||||
 | 
						host := cfg.Host
 | 
				
			||||||
 | 
						if strings.Contains(host, "?") {
 | 
				
			||||||
 | 
							host += "&"
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if !strings.HasSuffix(host, "/") {
 | 
				
			||||||
 | 
								host += "/?"
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								host += "?"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						s := "%stls=true&tlsCAFile=./%s&tlsCertificateKeyFile=./%s&tlsCertificateKeyFilePassword=%s&authMechanism=MONGODB-X509"
 | 
				
			||||||
 | 
						uri := fmt.Sprintf(s, host, caFilePath, certFilePath, pwd)
 | 
				
			||||||
 | 
						return uri
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetInstance ...
 | 
					// GetInstance ...
 | 
				
			||||||
func GetInstance() *mongo.Database {
 | 
					func GetInstance() *mongo.Database {
 | 
				
			||||||
	return db
 | 
						return db
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
package mongodb
 | 
					package mongodb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.mongodb.org/mongo-driver/mongo"
 | 
						"go.mongodb.org/mongo-driver/mongo"
 | 
				
			||||||
| 
						 | 
					@ -45,3 +46,58 @@ func Test_connectWithTLS(t *testing.T) {
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Test_getURIWithTLS(t *testing.T) {
 | 
				
			||||||
 | 
						type args struct {
 | 
				
			||||||
 | 
							cfg          Config
 | 
				
			||||||
 | 
							caFilePath   string
 | 
				
			||||||
 | 
							certFilePath string
 | 
				
			||||||
 | 
							pwd          string
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ca := "ca.pem"
 | 
				
			||||||
 | 
						cert := "cert.pem"
 | 
				
			||||||
 | 
						pwd := "1"
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name string
 | 
				
			||||||
 | 
							args args
 | 
				
			||||||
 | 
							want string
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "uri no options",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									cfg:          Config{Host: "mongodb://localhost:27017"},
 | 
				
			||||||
 | 
									caFilePath:   ca,
 | 
				
			||||||
 | 
									certFilePath: cert,
 | 
				
			||||||
 | 
									pwd:          pwd,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: fmt.Sprintf("mongodb://localhost:27017/?tls=true&tlsCAFile=./%s&tlsCertificateKeyFile=./%s&tlsCertificateKeyFilePassword=%s&authMechanism=MONGODB-X509", ca, cert, pwd),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "uri no options, end with /",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									cfg:          Config{Host: "mongodb://localhost:27017/"},
 | 
				
			||||||
 | 
									caFilePath:   ca,
 | 
				
			||||||
 | 
									certFilePath: cert,
 | 
				
			||||||
 | 
									pwd:          pwd,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: fmt.Sprintf("mongodb://localhost:27017/?tls=true&tlsCAFile=./%s&tlsCertificateKeyFile=./%s&tlsCertificateKeyFilePassword=%s&authMechanism=MONGODB-X509", ca, cert, pwd),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name: "uri has options",
 | 
				
			||||||
 | 
								args: args{
 | 
				
			||||||
 | 
									cfg:          Config{Host: "mongodb://localhost:27017/?a=1"},
 | 
				
			||||||
 | 
									caFilePath:   ca,
 | 
				
			||||||
 | 
									certFilePath: cert,
 | 
				
			||||||
 | 
									pwd:          pwd,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								want: fmt.Sprintf("mongodb://localhost:27017/?a=1&tls=true&tlsCAFile=./%s&tlsCertificateKeyFile=./%s&tlsCertificateKeyFilePassword=%s&authMechanism=MONGODB-X509", ca, cert, pwd),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, tt := range tests {
 | 
				
			||||||
 | 
							t.Run(tt.name, func(t *testing.T) {
 | 
				
			||||||
 | 
								if got := getURIWithTLS(tt.args.cfg, tt.args.caFilePath, tt.args.certFilePath, tt.args.pwd); got != tt.want {
 | 
				
			||||||
 | 
									t.Errorf("getURIWithTLS() = %v, want %v", got, tt.want)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue