aboutsummaryrefslogtreecommitdiffhomepage
path: root/config/parser.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2019-06-01 18:18:09 -0700
committerGravatar fguillot <fred@miniflux.net>2019-06-02 06:30:08 -0700
commit228862fefaa645026caa483ffe9993bf8c00b22e (patch)
tree2b590dc6cda3e50928a31ce673641357805f75ce /config/parser.go
parent04d85b3c63afcf6c9539fc8dc7a91c4e36c2e8fb (diff)
Refactor config package
- Parse configuration only once during startup time - Store configuration values in a global variable
Diffstat (limited to 'config/parser.go')
-rw-r--r--config/parser.go124
1 files changed, 124 insertions, 0 deletions
diff --git a/config/parser.go b/config/parser.go
new file mode 100644
index 0000000..996d0a8
--- /dev/null
+++ b/config/parser.go
@@ -0,0 +1,124 @@
+// Copyright 2019 Frédéric Guillot. All rights reserved.
+// Use of this source code is governed by the Apache 2.0
+// license that can be found in the LICENSE file.
+
+package config // import "miniflux.app/config"
+
+import (
+ "errors"
+ "fmt"
+ "net/url"
+ "os"
+ "strconv"
+ "strings"
+)
+
+func parse() (opts *Options, err error) {
+ opts = &Options{}
+ opts.baseURL, opts.rootURL, opts.basePath, err = parseBaseURL()
+ if err != nil {
+ return nil, err
+ }
+
+ opts.debug = getBooleanValue("DEBUG")
+ opts.listenAddr = parseListenAddr()
+
+ opts.databaseURL = getStringValue("DATABASE_URL", defaultDatabaseURL)
+ opts.databaseMaxConns = getIntValue("DATABASE_MAX_CONNS", defaultDatabaseMaxConns)
+ opts.databaseMinConns = getIntValue("DATABASE_MIN_CONNS", defaultDatabaseMinConns)
+ opts.runMigrations = getBooleanValue("RUN_MIGRATIONS")
+
+ opts.hsts = !getBooleanValue("DISABLE_HSTS")
+ opts.HTTPS = getBooleanValue("HTTPS")
+
+ opts.schedulerService = !getBooleanValue("DISABLE_SCHEDULER_SERVICE")
+ opts.httpService = !getBooleanValue("DISABLE_HTTP_SERVICE")
+
+ opts.certFile = getStringValue("CERT_FILE", defaultCertFile)
+ opts.certKeyFile = getStringValue("KEY_FILE", defaultKeyFile)
+ opts.certDomain = getStringValue("CERT_DOMAIN", defaultCertDomain)
+ opts.certCache = getStringValue("CERT_CACHE", defaultCertCache)
+
+ opts.cleanupFrequency = getIntValue("CLEANUP_FREQUENCY", defaultCleanupFrequency)
+ opts.workerPoolSize = getIntValue("WORKER_POOL_SIZE", defaultWorkerPoolSize)
+ opts.pollingFrequency = getIntValue("POLLING_FREQUENCY", defaultPollingFrequency)
+ opts.batchSize = getIntValue("BATCH_SIZE", defaultBatchSize)
+ opts.archiveReadDays = getIntValue("ARCHIVE_READ_DAYS", defaultArchiveReadDays)
+ opts.proxyImages = getStringValue("PROXY_IMAGES", defaultProxyImages)
+
+ opts.oauth2UserCreationAllowed = getBooleanValue("OAUTH2_USER_CREATION")
+ opts.oauth2ClientID = getStringValue("OAUTH2_CLIENT_ID", defaultOAuth2ClientID)
+ opts.oauth2ClientSecret = getStringValue("OAUTH2_CLIENT_SECRET", defaultOAuth2ClientSecret)
+ opts.oauth2RedirectURL = getStringValue("OAUTH2_REDIRECT_URL", defaultOAuth2RedirectURL)
+ opts.oauth2Provider = getStringValue("OAUTH2_PROVIDER", defaultOAuth2Provider)
+
+ opts.pocketConsumerKey = getStringValue("POCKET_CONSUMER_KEY", "")
+
+ opts.createAdmin = getBooleanValue("CREATE_ADMIN")
+
+ return opts, nil
+}
+
+func parseBaseURL() (string, string, string, error) {
+ baseURL := os.Getenv("BASE_URL")
+ if baseURL == "" {
+ return defaultBaseURL, defaultBaseURL, "", nil
+ }
+
+ if baseURL[len(baseURL)-1:] == "/" {
+ baseURL = baseURL[:len(baseURL)-1]
+ }
+
+ u, err := url.Parse(baseURL)
+ if err != nil {
+ return "", "", "", fmt.Errorf("Invalid BASE_URL: %v", err)
+ }
+
+ scheme := strings.ToLower(u.Scheme)
+ if scheme != "https" && scheme != "http" {
+ return "", "", "", errors.New("Invalid BASE_URL: scheme must be http or https")
+ }
+
+ basePath := u.Path
+ u.Path = ""
+ return baseURL, u.String(), basePath, nil
+}
+
+func parseListenAddr() string {
+ if port := os.Getenv("PORT"); port != "" {
+ return ":" + port
+ }
+
+ return getStringValue("LISTEN_ADDR", defaultListenAddr)
+}
+
+func getBooleanValue(key string) bool {
+ value := strings.ToLower(os.Getenv(key))
+ if value == "1" || value == "yes" || value == "true" || value == "on" {
+ return true
+ }
+ return false
+}
+
+func getStringValue(key, fallback string) string {
+ value := os.Getenv(key)
+ if value == "" {
+ return fallback
+ }
+
+ return value
+}
+
+func getIntValue(key string, fallback int) int {
+ value := os.Getenv(key)
+ if value == "" {
+ return fallback
+ }
+
+ v, err := strconv.Atoi(value)
+ if err != nil {
+ return fallback
+ }
+
+ return v
+}