NewDefaultConfig returns value, not pointer; Nested configs are defined as value

This commit is contained in:
DarthSim
2025-09-06 01:38:32 +03:00
parent 4789810b18
commit ac03563506
27 changed files with 133 additions and 128 deletions

View File

@@ -1,6 +1,9 @@
package auximageprovider package auximageprovider
import "github.com/imgproxy/imgproxy/v3/config" import (
"github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
)
// StaticConfig holds the configuration for the auxiliary image provider // StaticConfig holds the configuration for the auxiliary image provider
type StaticConfig struct { type StaticConfig struct {
@@ -10,8 +13,8 @@ type StaticConfig struct {
} }
// NewDefaultStaticConfig creates a new default configuration for the auxiliary image provider // NewDefaultStaticConfig creates a new default configuration for the auxiliary image provider
func NewDefaultStaticConfig() *StaticConfig { func NewDefaultStaticConfig() StaticConfig {
return &StaticConfig{ return StaticConfig{
Base64Data: "", Base64Data: "",
Path: "", Path: "",
URL: "", URL: "",
@@ -20,9 +23,7 @@ func NewDefaultStaticConfig() *StaticConfig {
// LoadWatermarkStaticConfigFromEnv loads the watermark configuration from the environment // LoadWatermarkStaticConfigFromEnv loads the watermark configuration from the environment
func LoadWatermarkStaticConfigFromEnv(c *StaticConfig) (*StaticConfig, error) { func LoadWatermarkStaticConfigFromEnv(c *StaticConfig) (*StaticConfig, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultStaticConfig)
c = NewDefaultStaticConfig()
}
c.Base64Data = config.WatermarkData c.Base64Data = config.WatermarkData
c.Path = config.WatermarkPath c.Path = config.WatermarkPath
@@ -33,9 +34,7 @@ func LoadWatermarkStaticConfigFromEnv(c *StaticConfig) (*StaticConfig, error) {
// LoadFallbackStaticConfigFromEnv loads the fallback configuration from the environment // LoadFallbackStaticConfigFromEnv loads the fallback configuration from the environment
func LoadFallbackStaticConfigFromEnv(c *StaticConfig) (*StaticConfig, error) { func LoadFallbackStaticConfigFromEnv(c *StaticConfig) (*StaticConfig, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultStaticConfig)
c = NewDefaultStaticConfig()
}
c.Base64Data = config.FallbackImageData c.Base64Data = config.FallbackImageData
c.Path = config.FallbackImagePath c.Path = config.FallbackImagePath

View File

@@ -169,11 +169,11 @@ func (s *ImageProviderTestSuite) TestNewProvider() {
} }
trc := transport.NewDefaultConfig() trc := transport.NewDefaultConfig()
tr, err := transport.New(trc) tr, err := transport.New(&trc)
s.Require().NoError(err) s.Require().NoError(err)
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
f, err := fetcher.New(tr, fc) f, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
idf := imagedata.NewFactory(f) idf := imagedata.NewFactory(f)

15
ensure/ensure.go Normal file
View File

@@ -0,0 +1,15 @@
package ensure
type EnsureFunc[T any] func() T
// Ensure ensures that the returned value is not nil.
// If the provided pointer is nil, the function calls the provided
// EnsureFunc to obtain a new value.
// Otherwise, it returns the original value.
func Ensure[T any](val *T, f EnsureFunc[T]) *T {
if val == nil {
v := f()
return &v
}
return val
}

View File

@@ -5,6 +5,7 @@ import (
"time" "time"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
"github.com/imgproxy/imgproxy/v3/version" "github.com/imgproxy/imgproxy/v3/version"
) )
@@ -19,8 +20,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new Config instance with default values. // NewDefaultConfig returns a new Config instance with default values.
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
UserAgent: "imgproxy/" + version.Version, UserAgent: "imgproxy/" + version.Version,
DownloadTimeout: 5 * time.Second, DownloadTimeout: 5 * time.Second,
MaxRedirects: 10, MaxRedirects: 10,
@@ -29,9 +30,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads config variables from env // LoadConfigFromEnv loads config variables from env
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.UserAgent = config.UserAgent c.UserAgent = config.UserAgent
c.DownloadTimeout = time.Duration(config.DownloadTimeout) * time.Second c.DownloadTimeout = time.Duration(config.DownloadTimeout) * time.Second

View File

@@ -5,6 +5,7 @@ import (
"net/http" "net/http"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config represents handler config // Config represents handler config
@@ -20,8 +21,8 @@ type Config struct {
} }
// NewDefaultConfig creates a new configuration with defaults // NewDefaultConfig creates a new configuration with defaults
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
PathPrefix: "", PathPrefix: "",
CookiePassthrough: false, CookiePassthrough: false,
ReportDownloadingErrors: true, ReportDownloadingErrors: true,
@@ -35,9 +36,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads config from environment variables // LoadConfigFromEnv loads config from environment variables
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.PathPrefix = config.PathPrefix c.PathPrefix = config.PathPrefix
c.CookiePassthrough = config.CookiePassthrough c.CookiePassthrough = config.CookiePassthrough

View File

@@ -2,6 +2,7 @@ package stream
import ( import (
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
"github.com/imgproxy/imgproxy/v3/httpheaders" "github.com/imgproxy/imgproxy/v3/httpheaders"
) )
@@ -18,8 +19,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new Config instance with default values. // NewDefaultConfig returns a new Config instance with default values.
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
CookiePassthrough: false, CookiePassthrough: false,
PassthroughRequestHeaders: []string{ PassthroughRequestHeaders: []string{
httpheaders.IfNoneMatch, httpheaders.IfNoneMatch,
@@ -40,9 +41,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads config variables from environment // LoadConfigFromEnv loads config variables from environment
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.CookiePassthrough = config.CookiePassthrough c.CookiePassthrough = config.CookiePassthrough

View File

@@ -57,16 +57,16 @@ func (s *HandlerTestSuite) SetupTest() {
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
fetcher, err := fetcher.New(tr, fc) fetcher, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
cfg := NewDefaultConfig() cfg := NewDefaultConfig()
hwc := headerwriter.NewDefaultConfig() hwc := headerwriter.NewDefaultConfig()
hw, err := headerwriter.New(hwc) hw, err := headerwriter.New(&hwc)
s.Require().NoError(err) s.Require().NoError(err)
h, err := New(cfg, hw, fetcher) h, err := New(&cfg, hw, fetcher)
s.Require().NoError(err) s.Require().NoError(err)
s.handler = h s.handler = h
} }
@@ -358,7 +358,7 @@ func (s *HandlerTestSuite) TestHandlerCacheControl() {
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
fetcher, err := fetcher.New(tr, fc) fetcher, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
cfg := NewDefaultConfig() cfg := NewDefaultConfig()
@@ -366,10 +366,10 @@ func (s *HandlerTestSuite) TestHandlerCacheControl() {
hwc.CacheControlPassthrough = tc.cacheControlPassthrough hwc.CacheControlPassthrough = tc.cacheControlPassthrough
hwc.DefaultTTL = 4242 hwc.DefaultTTL = 4242
hw, err := headerwriter.New(hwc) hw, err := headerwriter.New(&hwc)
s.Require().NoError(err) s.Require().NoError(err)
handler, err := New(cfg, hw, fetcher) handler, err := New(&cfg, hw, fetcher)
s.Require().NoError(err) s.Require().NoError(err)
req := httptest.NewRequest("GET", "/", nil) req := httptest.NewRequest("GET", "/", nil)
@@ -454,17 +454,17 @@ func (s *HandlerTestSuite) TestHandlerCookiePassthrough() {
s.Require().NoError(err) s.Require().NoError(err)
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
fetcher, err := fetcher.New(tr, fc) fetcher, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
cfg := NewDefaultConfig() cfg := NewDefaultConfig()
cfg.CookiePassthrough = true cfg.CookiePassthrough = true
hwc := headerwriter.NewDefaultConfig() hwc := headerwriter.NewDefaultConfig()
hw, err := headerwriter.New(hwc) hw, err := headerwriter.New(&hwc)
s.Require().NoError(err) s.Require().NoError(err)
handler, err := New(cfg, hw, fetcher) handler, err := New(&cfg, hw, fetcher)
s.Require().NoError(err) s.Require().NoError(err)
data := s.readTestFile("test1.png") data := s.readTestFile("test1.png")
@@ -514,7 +514,7 @@ func (s *HandlerTestSuite) TestHandlerCanonicalHeader() {
s.Require().NoError(err) s.Require().NoError(err)
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
fetcher, err := fetcher.New(tr, fc) fetcher, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
cfg := NewDefaultConfig() cfg := NewDefaultConfig()
@@ -522,10 +522,10 @@ func (s *HandlerTestSuite) TestHandlerCanonicalHeader() {
hwc.SetCanonicalHeader = sc hwc.SetCanonicalHeader = sc
hw, err := headerwriter.New(hwc) hw, err := headerwriter.New(&hwc)
s.Require().NoError(err) s.Require().NoError(err)
handler, err := New(cfg, hw, fetcher) handler, err := New(&cfg, hw, fetcher)
s.Require().NoError(err) s.Require().NoError(err)
req := httptest.NewRequest("GET", "/", nil) req := httptest.NewRequest("GET", "/", nil)

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config is the package-local configuration // Config is the package-local configuration
@@ -17,8 +18,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new Config instance with default values. // NewDefaultConfig returns a new Config instance with default values.
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
SetCanonicalHeader: false, SetCanonicalHeader: false,
DefaultTTL: 31536000, DefaultTTL: 31536000,
FallbackImageTTL: 0, FallbackImageTTL: 0,
@@ -30,9 +31,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv overrides configuration variables from environment // LoadConfigFromEnv overrides configuration variables from environment
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.SetCanonicalHeader = config.SetCanonicalHeader c.SetCanonicalHeader = config.SetCanonicalHeader
c.DefaultTTL = config.TTL c.DefaultTTL = config.TTL

View File

@@ -38,11 +38,11 @@ func (s *ProcessingTestSuite) SetupSuite() {
logrus.SetOutput(io.Discard) logrus.SetOutput(io.Discard)
trc := transport.NewDefaultConfig() trc := transport.NewDefaultConfig()
tr, err := transport.New(trc) tr, err := transport.New(&trc)
s.Require().NoError(err) s.Require().NoError(err)
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
f, err := fetcher.New(tr, fc) f, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
s.idf = imagedata.NewFactory(f) s.idf = imagedata.NewFactory(f)

View File

@@ -53,7 +53,7 @@ func (s *ProcessingHandlerTestSuite) SetupSuite() {
logrus.SetOutput(io.Discard) logrus.SetOutput(io.Discard)
cfg := server.NewDefaultConfig() cfg := server.NewDefaultConfig()
r, err := server.NewRouter(cfg) r, err := server.NewRouter(&cfg)
s.Require().NoError(err) s.Require().NoError(err)
s.router = buildRouter(r) s.router = buildRouter(r)

View File

@@ -5,6 +5,7 @@ import (
"runtime" "runtime"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config represents handler config // Config represents handler config
@@ -14,8 +15,8 @@ type Config struct {
} }
// NewDefaultConfig creates a new configuration with defaults // NewDefaultConfig creates a new configuration with defaults
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
RequestsQueueSize: 0, RequestsQueueSize: 0,
Workers: runtime.GOMAXPROCS(0) * 2, Workers: runtime.GOMAXPROCS(0) * 2,
} }
@@ -23,9 +24,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads config from environment variables // LoadConfigFromEnv loads config from environment variables
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.RequestsQueueSize = config.RequestsQueueSize c.RequestsQueueSize = config.RequestsQueueSize
c.Workers = config.Workers c.Workers = config.Workers

View File

@@ -6,6 +6,7 @@ import (
"time" "time"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
const ( const (
@@ -32,8 +33,8 @@ type Config struct {
} }
// NewDefaultConfig returns default config values // NewDefaultConfig returns default config values
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
Network: "tcp", Network: "tcp",
Bind: ":8080", Bind: ":8080",
PathPrefix: "", PathPrefix: "",
@@ -52,9 +53,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv overrides current values with environment variables // LoadConfigFromEnv overrides current values with environment variables
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.Network = config.Network c.Network = config.Network
c.Bind = config.Bind c.Bind = config.Bind

View File

@@ -19,7 +19,7 @@ func (s *RouterTestSuite) SetupTest() {
c := NewDefaultConfig() c := NewDefaultConfig()
c.PathPrefix = "/api" c.PathPrefix = "/api"
r, err := NewRouter(c) r, err := NewRouter(&c)
s.Require().NoError(err) s.Require().NoError(err)
s.router = r s.router = r

View File

@@ -22,7 +22,7 @@ type ServerTestSuite struct {
func (s *ServerTestSuite) SetupTest() { func (s *ServerTestSuite) SetupTest() {
c := NewDefaultConfig() c := NewDefaultConfig()
s.config = c s.config = &c
s.config.Bind = "127.0.0.1:0" // Use port 0 for auto-assignment s.config.Bind = "127.0.0.1:0" // Use port 0 for auto-assignment
r, err := NewRouter(s.config) r, err := NewRouter(s.config)
s.Require().NoError(err) s.Require().NoError(err)
@@ -46,7 +46,7 @@ func (s *ServerTestSuite) TestStartServerWithInvalidBind() {
invalidConfig := NewDefaultConfig() invalidConfig := NewDefaultConfig()
invalidConfig.Bind = "-1.-1.-1.-1" // Invalid address invalidConfig.Bind = "-1.-1.-1.-1" // Invalid address
r, err := NewRouter(invalidConfig) r, err := NewRouter(&invalidConfig)
s.Require().NoError(err) s.Require().NoError(err)
server, err := Start(cancelWrapper, r) server, err := Start(cancelWrapper, r)
@@ -113,7 +113,7 @@ func (s *ServerTestSuite) TestWithCORS() {
config := NewDefaultConfig() config := NewDefaultConfig()
config.CORSAllowOrigin = tt.corsAllowOrigin config.CORSAllowOrigin = tt.corsAllowOrigin
router, err := NewRouter(config) router, err := NewRouter(&config)
s.Require().NoError(err) s.Require().NoError(err)
wrappedHandler := router.WithCORS(s.mockHandler) wrappedHandler := router.WithCORS(s.mockHandler)
@@ -159,7 +159,7 @@ func (s *ServerTestSuite) TestWithSecret() {
config := NewDefaultConfig() config := NewDefaultConfig()
config.Secret = tt.secret config.Secret = tt.secret
router, err := NewRouter(config) router, err := NewRouter(&config)
s.Require().NoError(err) s.Require().NoError(err)
wrappedHandler := router.WithSecret(s.mockHandler) wrappedHandler := router.WithSecret(s.mockHandler)

View File

@@ -23,11 +23,11 @@ func (s *SvgTestSuite) SetupSuite() {
config.Reset() config.Reset()
trc := transport.NewDefaultConfig() trc := transport.NewDefaultConfig()
tr, err := transport.New(trc) tr, err := transport.New(&trc)
s.Require().NoError(err) s.Require().NoError(err)
fc := fetcher.NewDefaultConfig() fc := fetcher.NewDefaultConfig()
f, err := fetcher.New(tr, fc) f, err := fetcher.New(tr, &fc)
s.Require().NoError(err) s.Require().NoError(err)
s.idf = imagedata.NewFactory(f) s.idf = imagedata.NewFactory(f)

View File

@@ -49,11 +49,11 @@ func (s *AzureTestSuite) SetupSuite() {
tc := generichttp.NewDefaultConfig() tc := generichttp.NewDefaultConfig()
tc.IgnoreSslVerification = true tc.IgnoreSslVerification = true
trans, gerr := generichttp.New(false, tc) trans, gerr := generichttp.New(false, &tc)
s.Require().NoError(gerr) s.Require().NoError(gerr)
var err error var err error
s.transport, err = New(config, trans) s.transport, err = New(&config, trans)
s.Require().NoError(err) s.Require().NoError(err)
} }

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config holds the configuration for Azure Blob Storage transport // Config holds the configuration for Azure Blob Storage transport
@@ -14,8 +15,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new default configuration for Azure Blob Storage transport // NewDefaultConfig returns a new default configuration for Azure Blob Storage transport
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
Name: "", Name: "",
Endpoint: "", Endpoint: "",
Key: "", Key: "",
@@ -24,9 +25,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads configuration from the global config package // LoadConfigFromEnv loads configuration from the global config package
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.Name = config.ABSName c.Name = config.ABSName
c.Endpoint = config.ABSEndpoint c.Endpoint = config.ABSEndpoint

View File

@@ -4,6 +4,7 @@ package transport
import ( import (
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
"github.com/imgproxy/imgproxy/v3/transport/azure" "github.com/imgproxy/imgproxy/v3/transport/azure"
"github.com/imgproxy/imgproxy/v3/transport/fs" "github.com/imgproxy/imgproxy/v3/transport/fs"
"github.com/imgproxy/imgproxy/v3/transport/gcs" "github.com/imgproxy/imgproxy/v3/transport/gcs"
@@ -14,26 +15,26 @@ import (
// Config represents configuration of the transport package // Config represents configuration of the transport package
type Config struct { type Config struct {
HTTP *generichttp.Config HTTP generichttp.Config
Local *fs.Config Local fs.Config
ABSEnabled bool ABSEnabled bool
ABS *azure.Config ABS azure.Config
GCSEnabled bool GCSEnabled bool
GCS *gcs.Config GCS gcs.Config
S3Enabled bool S3Enabled bool
S3 *s3.Config S3 s3.Config
SwiftEnabled bool SwiftEnabled bool
Swift *swift.Config Swift swift.Config
} }
// NewDefaultConfig returns a new default transport configuration // NewDefaultConfig returns a new default transport configuration
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
HTTP: generichttp.NewDefaultConfig(), HTTP: generichttp.NewDefaultConfig(),
Local: fs.NewDefaultConfig(), Local: fs.NewDefaultConfig(),
ABSEnabled: false, ABSEnabled: false,
@@ -49,33 +50,31 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads transport configuration from environment variables // LoadConfigFromEnv loads transport configuration from environment variables
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
var err error var err error
if c.HTTP, err = generichttp.LoadConfigFromEnv(c.HTTP); err != nil { if _, err = generichttp.LoadConfigFromEnv(&c.HTTP); err != nil {
return nil, err return nil, err
} }
if c.Local, err = fs.LoadConfigFromEnv(c.Local); err != nil { if _, err = fs.LoadConfigFromEnv(&c.Local); err != nil {
return nil, err return nil, err
} }
if c.ABS, err = azure.LoadConfigFromEnv(c.ABS); err != nil { if _, err = azure.LoadConfigFromEnv(&c.ABS); err != nil {
return nil, err return nil, err
} }
if c.GCS, err = gcs.LoadConfigFromEnv(c.GCS); err != nil { if _, err = gcs.LoadConfigFromEnv(&c.GCS); err != nil {
return nil, err return nil, err
} }
if c.S3, err = s3.LoadConfigFromEnv(c.S3); err != nil { if _, err = s3.LoadConfigFromEnv(&c.S3); err != nil {
return nil, err return nil, err
} }
if c.Swift, err = swift.LoadConfigFromEnv(c.Swift); err != nil { if _, err = swift.LoadConfigFromEnv(&c.Swift); err != nil {
return nil, err return nil, err
} }

View File

@@ -6,6 +6,7 @@ import (
"os" "os"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config holds the configuration for local file system transport // Config holds the configuration for local file system transport
@@ -14,17 +15,15 @@ type Config struct {
} }
// NewDefaultConfig returns a new default configuration for local file system transport // NewDefaultConfig returns a new default configuration for local file system transport
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
Root: "", Root: "",
} }
} }
// LoadConfigFromEnv loads configuration from the global config package // LoadConfigFromEnv loads configuration from the global config package
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.Root = config.LocalFileSystemRoot c.Root = config.LocalFileSystemRoot

View File

@@ -1,6 +1,9 @@
package gcs package gcs
import "github.com/imgproxy/imgproxy/v3/config" import (
"github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
)
// Config holds the configuration for Google Cloud Storage transport // Config holds the configuration for Google Cloud Storage transport
type Config struct { type Config struct {
@@ -9,8 +12,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new default configuration for Google Cloud Storage transport // NewDefaultConfig returns a new default configuration for Google Cloud Storage transport
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
Key: "", Key: "",
Endpoint: "", Endpoint: "",
} }
@@ -18,9 +21,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads configuration from the global config package // LoadConfigFromEnv loads configuration from the global config package
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.Key = config.GCSKey c.Key = config.GCSKey
c.Endpoint = config.GCSEndpoint c.Endpoint = config.GCSEndpoint

View File

@@ -74,10 +74,10 @@ func (s *GCSTestSuite) SetupSuite() {
tc := generichttp.NewDefaultConfig() tc := generichttp.NewDefaultConfig()
tc.IgnoreSslVerification = true tc.IgnoreSslVerification = true
trans, gerr := generichttp.New(false, tc) trans, gerr := generichttp.New(false, &tc)
s.Require().NoError(gerr) s.Require().NoError(gerr)
s.transport, err = New(config, trans) s.transport, err = New(&config, trans)
s.Require().NoError(err) s.Require().NoError(err)
} }

View File

@@ -5,6 +5,7 @@ import (
"time" "time"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config holds the configuration for the generic HTTP transport // Config holds the configuration for the generic HTTP transport
@@ -14,8 +15,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new default configuration for the generic HTTP transport // NewDefaultConfig returns a new default configuration for the generic HTTP transport
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
ClientKeepAliveTimeout: 90 * time.Second, ClientKeepAliveTimeout: 90 * time.Second,
IgnoreSslVerification: false, IgnoreSslVerification: false,
} }
@@ -23,9 +24,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads configuration from the global config package // LoadConfigFromEnv loads configuration from the global config package
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.ClientKeepAliveTimeout = time.Duration(config.ClientKeepAliveTimeout) * time.Second c.ClientKeepAliveTimeout = time.Duration(config.ClientKeepAliveTimeout) * time.Second
c.IgnoreSslVerification = config.IgnoreSslVerification c.IgnoreSslVerification = config.IgnoreSslVerification

View File

@@ -1,6 +1,9 @@
package s3 package s3
import "github.com/imgproxy/imgproxy/v3/config" import (
"github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
)
// Config holds the configuration for S3 transport // Config holds the configuration for S3 transport
type Config struct { type Config struct {
@@ -13,8 +16,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new default configuration for S3 transport // NewDefaultConfig returns a new default configuration for S3 transport
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
Region: "", Region: "",
Endpoint: "", Endpoint: "",
EndpointUsePathStyle: true, EndpointUsePathStyle: true,
@@ -26,9 +29,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads configuration from the global config package // LoadConfigFromEnv loads configuration from the global config package
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.Region = config.S3Region c.Region = config.S3Region
c.Endpoint = config.S3Endpoint c.Endpoint = config.S3Endpoint

View File

@@ -42,11 +42,11 @@ func (s *S3TestSuite) SetupSuite() {
tc := generichttp.NewDefaultConfig() tc := generichttp.NewDefaultConfig()
tc.IgnoreSslVerification = true tc.IgnoreSslVerification = true
trans, gerr := generichttp.New(false, tc) trans, gerr := generichttp.New(false, &tc)
s.Require().NoError(gerr) s.Require().NoError(gerr)
var err error var err error
s.transport, err = New(config, trans) s.transport, err = New(&config, trans)
s.Require().NoError(err) s.Require().NoError(err)
err = backend.CreateBucket("test") err = backend.CreateBucket("test")

View File

@@ -4,6 +4,7 @@ import (
"time" "time"
"github.com/imgproxy/imgproxy/v3/config" "github.com/imgproxy/imgproxy/v3/config"
"github.com/imgproxy/imgproxy/v3/ensure"
) )
// Config holds the configuration for Swift transport // Config holds the configuration for Swift transport
@@ -19,8 +20,8 @@ type Config struct {
} }
// NewDefaultConfig returns a new default configuration for Swift transport // NewDefaultConfig returns a new default configuration for Swift transport
func NewDefaultConfig() *Config { func NewDefaultConfig() Config {
return &Config{ return Config{
Username: "", Username: "",
APIKey: "", APIKey: "",
AuthURL: "", AuthURL: "",
@@ -34,9 +35,7 @@ func NewDefaultConfig() *Config {
// LoadConfigFromEnv loads configuration from the global config package // LoadConfigFromEnv loads configuration from the global config package
func LoadConfigFromEnv(c *Config) (*Config, error) { func LoadConfigFromEnv(c *Config) (*Config, error) {
if c == nil { c = ensure.Ensure(c, NewDefaultConfig)
c = NewDefaultConfig()
}
c.Username = config.SwiftUsername c.Username = config.SwiftUsername
c.APIKey = config.SwiftAPIKey c.APIKey = config.SwiftAPIKey

View File

@@ -36,16 +36,16 @@ func (s *SwiftTestSuite) SetupSuite() {
config.APIKey = swifttest.TEST_ACCOUNT config.APIKey = swifttest.TEST_ACCOUNT
config.AuthVersion = 1 config.AuthVersion = 1
s.setupTestFile(config) s.setupTestFile(&config)
tc := generichttp.NewDefaultConfig() tc := generichttp.NewDefaultConfig()
tc.IgnoreSslVerification = true tc.IgnoreSslVerification = true
trans, gerr := generichttp.New(false, tc) trans, gerr := generichttp.New(false, &tc)
s.Require().NoError(gerr) s.Require().NoError(gerr)
var err error var err error
s.transport, err = New(config, trans) s.transport, err = New(&config, trans)
s.Require().NoError(err, "failed to initialize swift transport") s.Require().NoError(err, "failed to initialize swift transport")
} }

View File

@@ -27,7 +27,7 @@ func New(config *Config) (*Transport, error) {
return nil, err return nil, err
} }
transport, err := generichttp.New(true, config.HTTP) transport, err := generichttp.New(true, &config.HTTP)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -71,17 +71,17 @@ func (t *Transport) IsProtocolRegistered(scheme string) bool {
// RegisterAllProtocols registers all enabled protocols in the given transport // RegisterAllProtocols registers all enabled protocols in the given transport
func (t *Transport) registerAllProtocols() error { func (t *Transport) registerAllProtocols() error {
transp, err := generichttp.New(false, t.config.HTTP) transp, err := generichttp.New(false, &t.config.HTTP)
if err != nil { if err != nil {
return err return err
} }
if t.config.Local.Root != "" { if t.config.Local.Root != "" {
t.RegisterProtocol("local", fsTransport.New(t.config.Local)) t.RegisterProtocol("local", fsTransport.New(&t.config.Local))
} }
if t.config.S3Enabled { if t.config.S3Enabled {
if tr, err := s3Transport.New(t.config.S3, transp); err != nil { if tr, err := s3Transport.New(&t.config.S3, transp); err != nil {
return err return err
} else { } else {
t.RegisterProtocol("s3", tr) t.RegisterProtocol("s3", tr)
@@ -89,7 +89,7 @@ func (t *Transport) registerAllProtocols() error {
} }
if t.config.GCSEnabled { if t.config.GCSEnabled {
if tr, err := gcsTransport.New(t.config.GCS, transp); err != nil { if tr, err := gcsTransport.New(&t.config.GCS, transp); err != nil {
return err return err
} else { } else {
t.RegisterProtocol("gs", tr) t.RegisterProtocol("gs", tr)
@@ -97,7 +97,7 @@ func (t *Transport) registerAllProtocols() error {
} }
if t.config.ABSEnabled { if t.config.ABSEnabled {
if tr, err := azureTransport.New(t.config.ABS, transp); err != nil { if tr, err := azureTransport.New(&t.config.ABS, transp); err != nil {
return err return err
} else { } else {
t.RegisterProtocol("abs", tr) t.RegisterProtocol("abs", tr)
@@ -105,7 +105,7 @@ func (t *Transport) registerAllProtocols() error {
} }
if t.config.SwiftEnabled { if t.config.SwiftEnabled {
if tr, err := swiftTransport.New(t.config.Swift, transp); err != nil { if tr, err := swiftTransport.New(&t.config.Swift, transp); err != nil {
return err return err
} else { } else {
t.RegisterProtocol("swift", tr) t.RegisterProtocol("swift", tr)