From 982746c0669b0f8f1bd5cc260780adcf9851cf9a Mon Sep 17 00:00:00 2001 From: Zehong Yin Date: Tue, 29 Aug 2023 16:40:13 -0700 Subject: [PATCH] the db URL should be http://127.0.0.1:9000?ns=dbname or https://.firebaseio.com // FIREBASE_DATABASE_EMULATOR_HOST in doc https://firebase.google.com/docs/emulator-suite/connect_rtdb#admin_sdks // Format should only be host:port, "127.0.0.1:9000" --- db/db.go | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/db/db.go b/db/db.go index f53a197c..7a3ea622 100644 --- a/db/db.go +++ b/db/db.go @@ -174,10 +174,6 @@ func parseURLConfig(dbURL string) (*dbURLConfig, bool, error) { environmentEmulatorURL := os.Getenv(emulatorDatabaseEnvVar) if environmentEmulatorURL != "" { - parsedURL, err = url.ParseRequestURI(environmentEmulatorURL) - if err != nil { - return nil, false, fmt.Errorf("%s: %w", environmentEmulatorURL, errInvalidURL) - } cfg, err := parseEmulatorHost(environmentEmulatorURL, parsedURL) return cfg, true, err } @@ -192,23 +188,31 @@ func parseURLConfig(dbURL string) (*dbURLConfig, bool, error) { }, false, nil } -func parseEmulatorHost(rawEmulatorHostURL string, parsedEmulatorHost *url.URL) (*dbURLConfig, error) { - if strings.Contains(rawEmulatorHostURL, "//") { +func parseEmulatorHost(rawEmulatorHostURL string, parsedDbURL *url.URL) (*dbURLConfig, error) { + parsedEmulatorURL, err := url.ParseRequestURI("http://" + rawEmulatorHostURL) + if err != nil { return nil, fmt.Errorf(`invalid %s: "%s". It must follow format "host:port": %w`, emulatorDatabaseEnvVar, rawEmulatorHostURL, errInvalidURL) } - - baseURL := strings.Replace(rawEmulatorHostURL, fmt.Sprintf("?%s", parsedEmulatorHost.RawQuery), "", -1) - if parsedEmulatorHost.Scheme != "http" { + // FIREBASE_DATABASE_EMULATOR_HOST in doc https://firebase.google.com/docs/emulator-suite/connect_rtdb#admin_sdks + // Format should only be host:port, "127.0.0.1:9000" + baseURL := parsedEmulatorURL.Host + if parsedDbURL.Scheme != "http" { baseURL = fmt.Sprintf("http://%s", baseURL) } - namespace := parsedEmulatorHost.Query().Get(emulatorNamespaceParam) + namespace := parsedDbURL.Query().Get(emulatorNamespaceParam) if namespace == "" { - if strings.Contains(rawEmulatorHostURL, ".") { + if strings.Contains(rawEmulatorHostURL, ".") && !strings.Contains(rawEmulatorHostURL, "127.0.0.1") { namespace = strings.Split(rawEmulatorHostURL, ".")[0] - } - if namespace == "" { - return nil, fmt.Errorf(`invalid database URL: "%s". Database URL must be a valid URL to a Firebase Realtime Database instance (include ?ns= query param)`, parsedEmulatorHost) + if namespace == "" { + return nil, fmt.Errorf(`invalid database URL: "%s". Database URL must be a valid URL to a Firebase Realtime Database instance (Emulator URL include ?ns= query param, or Real DB URL in Firebase Console with https://.firebaseio.com)`, parsedDbURL) + } + + } else { + namespace = strings.Split(parsedDbURL.Host, ".")[0] + if namespace == "" { + return nil, fmt.Errorf(`invalid database URL: "%s". Database URL must be a valid URL to a Firebase Realtime Database instance (Emulator URL include ?ns= query param, or Real DB URL in Firebase Console with https://.firebaseio.com)`, parsedDbURL) + } } }