aboutsummaryrefslogtreecommitdiffhomepage
path: root/config
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <fred@miniflux.net>2019-06-02 07:13:35 -0700
committerGravatar fguillot <fred@miniflux.net>2019-06-02 07:29:56 -0700
commitbb720c87c191efe36a328d95a918f75df51d4976 (patch)
tree35b6e87ddf5c0b37208f489fd6680075f269a3ef /config
parent228862fefaa645026caa483ffe9993bf8c00b22e (diff)
Make HTTP Client timeout and max body size configurable
Diffstat (limited to 'config')
-rw-r--r--config/config_test.go66
-rw-r--r--config/options.go52
-rw-r--r--config/parser.go7
3 files changed, 103 insertions, 22 deletions
diff --git a/config/config_test.go b/config/config_test.go
index 0e691fc..6b6cdf2 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -984,3 +984,69 @@ func TestHTTPSOn(t *testing.T) {
t.Fatalf(`Unexpected HTTPS value, got "%v"`, opts.HTTPS)
}
}
+
+func TestHTTPClientTimeout(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("HTTP_CLIENT_TIMEOUT", "42")
+
+ opts, err := parse()
+ if err != nil {
+ t.Fatalf(`Parsing failure: %q`, err)
+ }
+
+ expected := 42
+ result := opts.HTTPClientTimeout()
+
+ if result != expected {
+ t.Fatalf(`Unexpected HTTP_CLIENT_TIMEOUT value, got %d instead of %d`, result, expected)
+ }
+}
+
+func TestDefaultHTTPClientTimeoutValue(t *testing.T) {
+ os.Clearenv()
+
+ opts, err := parse()
+ if err != nil {
+ t.Fatalf(`Parsing failure: %q`, err)
+ }
+
+ expected := defaultHTTPClientTimeout
+ result := opts.HTTPClientTimeout()
+
+ if result != expected {
+ t.Fatalf(`Unexpected HTTP_CLIENT_TIMEOUT value, got %d instead of %d`, result, expected)
+ }
+}
+
+func TestHTTPClientMaxBodySize(t *testing.T) {
+ os.Clearenv()
+ os.Setenv("HTTP_CLIENT_MAX_BODY_SIZE", "42")
+
+ opts, err := parse()
+ if err != nil {
+ t.Fatalf(`Parsing failure: %q`, err)
+ }
+
+ expected := int64(42 * 1024 * 1024)
+ result := opts.HTTPClientMaxBodySize()
+
+ if result != expected {
+ t.Fatalf(`Unexpected HTTP_CLIENT_MAX_BODY_SIZE value, got %d instead of %d`, result, expected)
+ }
+}
+
+func TestDefaultHTTPClientMaxBodySizeValue(t *testing.T) {
+ os.Clearenv()
+
+ opts, err := parse()
+ if err != nil {
+ t.Fatalf(`Parsing failure: %q`, err)
+ }
+
+ expected := int64(defaultHTTPClientMaxBodySize * 1024 * 1024)
+ result := opts.HTTPClientMaxBodySize()
+
+ if result != expected {
+ t.Fatalf(`Unexpected HTTP_CLIENT_MAX_BODY_SIZE value, got %d instead of %d`, result, expected)
+ }
+}
diff --git a/config/options.go b/config/options.go
index ad8d2c7..32105e9 100644
--- a/config/options.go
+++ b/config/options.go
@@ -5,25 +5,27 @@
package config // import "miniflux.app/config"
const (
- defaultBaseURL = "http://localhost"
- defaultWorkerPoolSize = 5
- defaultPollingFrequency = 60
- defaultBatchSize = 10
- defaultDatabaseURL = "user=postgres password=postgres dbname=miniflux2 sslmode=disable"
- defaultDatabaseMaxConns = 20
- defaultDatabaseMinConns = 1
- defaultArchiveReadDays = 60
- defaultListenAddr = "127.0.0.1:8080"
- defaultCertFile = ""
- defaultKeyFile = ""
- defaultCertDomain = ""
- defaultCertCache = "/tmp/cert_cache"
- defaultCleanupFrequency = 24
- defaultProxyImages = "http-only"
- defaultOAuth2ClientID = ""
- defaultOAuth2ClientSecret = ""
- defaultOAuth2RedirectURL = ""
- defaultOAuth2Provider = ""
+ defaultBaseURL = "http://localhost"
+ defaultWorkerPoolSize = 5
+ defaultPollingFrequency = 60
+ defaultBatchSize = 10
+ defaultDatabaseURL = "user=postgres password=postgres dbname=miniflux2 sslmode=disable"
+ defaultDatabaseMaxConns = 20
+ defaultDatabaseMinConns = 1
+ defaultArchiveReadDays = 60
+ defaultListenAddr = "127.0.0.1:8080"
+ defaultCertFile = ""
+ defaultKeyFile = ""
+ defaultCertDomain = ""
+ defaultCertCache = "/tmp/cert_cache"
+ defaultCleanupFrequency = 24
+ defaultProxyImages = "http-only"
+ defaultOAuth2ClientID = ""
+ defaultOAuth2ClientSecret = ""
+ defaultOAuth2RedirectURL = ""
+ defaultOAuth2Provider = ""
+ defaultHTTPClientTimeout = 20
+ defaultHTTPClientMaxBodySize = 15
)
// Options contains configuration options.
@@ -58,6 +60,8 @@ type Options struct {
oauth2RedirectURL string
oauth2Provider string
pocketConsumerKey string
+ httpClientTimeout int
+ httpClientMaxBodySize int64
}
// HasDebugMode returns true if debug mode is enabled.
@@ -212,3 +216,13 @@ func (o *Options) PocketConsumerKey(defaultValue string) string {
}
return defaultValue
}
+
+// HTTPClientTimeout returns the time limit in seconds before the HTTP client cancel the request.
+func (o *Options) HTTPClientTimeout() int {
+ return o.httpClientTimeout
+}
+
+// HTTPClientMaxBodySize returns the number of bytes allowed for the HTTP client to transfer.
+func (o *Options) HTTPClientMaxBodySize() int64 {
+ return o.httpClientMaxBodySize
+}
diff --git a/config/parser.go b/config/parser.go
index 996d0a8..b2ed2e7 100644
--- a/config/parser.go
+++ b/config/parser.go
@@ -45,6 +45,8 @@ func parse() (opts *Options, err error) {
opts.batchSize = getIntValue("BATCH_SIZE", defaultBatchSize)
opts.archiveReadDays = getIntValue("ARCHIVE_READ_DAYS", defaultArchiveReadDays)
opts.proxyImages = getStringValue("PROXY_IMAGES", defaultProxyImages)
+ opts.createAdmin = getBooleanValue("CREATE_ADMIN")
+ opts.pocketConsumerKey = getStringValue("POCKET_CONSUMER_KEY", "")
opts.oauth2UserCreationAllowed = getBooleanValue("OAUTH2_USER_CREATION")
opts.oauth2ClientID = getStringValue("OAUTH2_CLIENT_ID", defaultOAuth2ClientID)
@@ -52,9 +54,8 @@ func parse() (opts *Options, err error) {
opts.oauth2RedirectURL = getStringValue("OAUTH2_REDIRECT_URL", defaultOAuth2RedirectURL)
opts.oauth2Provider = getStringValue("OAUTH2_PROVIDER", defaultOAuth2Provider)
- opts.pocketConsumerKey = getStringValue("POCKET_CONSUMER_KEY", "")
-
- opts.createAdmin = getBooleanValue("CREATE_ADMIN")
+ opts.httpClientTimeout = getIntValue("HTTP_CLIENT_TIMEOUT", defaultHTTPClientTimeout)
+ opts.httpClientMaxBodySize = int64(getIntValue("HTTP_CLIENT_MAX_BODY_SIZE", defaultHTTPClientMaxBodySize) * 1024 * 1024)
return opts, nil
}