diff --git a/app/http/routes/models/blocking_request.go b/app/http/routes/models/blocking_request.go index 9a56d94..6e82f12 100644 --- a/app/http/routes/models/blocking_request.go +++ b/app/http/routes/models/blocking_request.go @@ -4,6 +4,6 @@ import "time" type BlockingRequest struct { Names []string `form:"names" binding:"required"` - SessionDuration time.Duration `form:"session_duration" binding:"required"` + SessionDuration time.Duration `form:"session_duration"` Timeout time.Duration `form:"timeout"` } diff --git a/app/http/routes/models/dynamic_request.go b/app/http/routes/models/dynamic_request.go index bac9992..c367668 100644 --- a/app/http/routes/models/dynamic_request.go +++ b/app/http/routes/models/dynamic_request.go @@ -9,6 +9,6 @@ type DynamicRequest struct { ShowDetails bool `form:"show_details"` DisplayName string `form:"display_name"` Theme string `form:"theme"` - SessionDuration time.Duration `form:"session_duration" binding:"required"` + SessionDuration time.Duration `form:"session_duration"` RefreshFrequency time.Duration `form:"refresh_frequency"` } diff --git a/app/http/routes/strategies.go b/app/http/routes/strategies.go index 87d1680..833feab 100644 --- a/app/http/routes/strategies.go +++ b/app/http/routes/strategies.go @@ -28,17 +28,19 @@ type ServeStrategy struct { SessionsManager sessions.Manager StrategyConfig config.Strategy + SessionsConfig config.Sessions } -func NewServeStrategy(sessionsManager sessions.Manager, conf config.Strategy) *ServeStrategy { +func NewServeStrategy(sessionsManager sessions.Manager, strategyConf config.Strategy, sessionsConf config.Sessions) *ServeStrategy { serveStrategy := &ServeStrategy{ SessionsManager: sessionsManager, - StrategyConfig: conf, + StrategyConfig: strategyConf, + SessionsConfig: sessionsConf, } - if conf.Dynamic.CustomThemesPath != "" { - customThemesFs := osDirFS(conf.Dynamic.CustomThemesPath) + if strategyConf.Dynamic.CustomThemesPath != "" { + customThemesFs := osDirFS(strategyConf.Dynamic.CustomThemesPath) serveStrategy.customThemesFS = customThemesFs serveStrategy.customThemes = listThemes(customThemesFs) } @@ -51,6 +53,7 @@ func (s *ServeStrategy) ServeDynamic(c *gin.Context) { Theme: s.StrategyConfig.Dynamic.DefaultTheme, ShowDetails: s.StrategyConfig.Dynamic.ShowDetailsByDefault, RefreshFrequency: s.StrategyConfig.Dynamic.DefaultRefreshFrequency, + SessionDuration: s.SessionsConfig.DefaultDuration, } if err := c.ShouldBind(&request); err != nil { diff --git a/app/http/routes/strategies_test.go b/app/http/routes/strategies_test.go index 941cd53..a7eb13b 100644 --- a/app/http/routes/strategies_test.go +++ b/app/http/routes/strategies_test.go @@ -264,7 +264,8 @@ func createMap(instances []*instance.State) (store *sync.Map) { func TestNewServeStrategy(t *testing.T) { type args struct { sessionsManager sessions.Manager - conf config.Strategy + strategyConf config.Strategy + sessionsConf config.Sessions } tests := []struct { name string @@ -276,7 +277,7 @@ func TestNewServeStrategy(t *testing.T) { name: "load custom themes", args: args{ sessionsManager: &SessionsManagerMock{}, - conf: config.Strategy{ + strategyConf: config.Strategy{ Dynamic: config.DynamicStrategy{ CustomThemesPath: "my/path/to/themes", }, @@ -295,7 +296,7 @@ func TestNewServeStrategy(t *testing.T) { name: "load custom themes recursively", args: args{ sessionsManager: &SessionsManagerMock{}, - conf: config.Strategy{ + strategyConf: config.Strategy{ Dynamic: config.DynamicStrategy{ CustomThemesPath: "my/path/to/themes", }, @@ -316,7 +317,7 @@ func TestNewServeStrategy(t *testing.T) { name: "do not load custom themes outside of path", args: args{ sessionsManager: &SessionsManagerMock{}, - conf: config.Strategy{ + strategyConf: config.Strategy{ Dynamic: config.DynamicStrategy{ CustomThemesPath: "my/path/to/themes", }, @@ -353,7 +354,7 @@ func TestNewServeStrategy(t *testing.T) { osDirFS = myOsDirFS - if got := NewServeStrategy(tt.args.sessionsManager, tt.args.conf); !reflect.DeepEqual(got.customThemes, tt.want) { + if got := NewServeStrategy(tt.args.sessionsManager, tt.args.strategyConf, tt.args.sessionsConf); !reflect.DeepEqual(got.customThemes, tt.want) { t.Errorf("NewServeStrategy() = %v, want %v", got.customThemes, tt.want) } }) @@ -363,6 +364,7 @@ func TestNewServeStrategy(t *testing.T) { func TestServeStrategy_ServeDynamicThemes(t *testing.T) { type fields struct { StrategyConfig config.Strategy + SessionsConfig config.Sessions } tests := []struct { name string @@ -428,7 +430,7 @@ func TestServeStrategy_ServeDynamicThemes(t *testing.T) { osDirFS = myOsDirFS - s := NewServeStrategy(nil, tt.fields.StrategyConfig) + s := NewServeStrategy(nil, tt.fields.StrategyConfig, tt.fields.SessionsConfig) recorder := httptest.NewRecorder() c := GetTestGinContext(recorder) diff --git a/app/http/server.go b/app/http/server.go index 9a0a240..17b3975 100644 --- a/app/http/server.go +++ b/app/http/server.go @@ -17,7 +17,7 @@ import ( "github.com/gin-gonic/gin" ) -func Start(serverConf config.Server, strategyConf config.Strategy, sessionManager sessions.Manager) { +func Start(serverConf config.Server, strategyConf config.Strategy, sessionsConf config.Sessions, sessionManager sessions.Manager) { ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() @@ -29,7 +29,7 @@ func Start(serverConf config.Server, strategyConf config.Strategy, sessionManage { api := base.Group("/api") { - strategy := routes.NewServeStrategy(sessionManager, strategyConf) + strategy := routes.NewServeStrategy(sessionManager, strategyConf, sessionsConf) api.GET("/strategies/dynamic", strategy.ServeDynamic) api.GET("/strategies/dynamic/themes", strategy.ServeDynamicThemes) api.GET("/strategies/blocking", strategy.ServeBlocking) diff --git a/app/sablier.go b/app/sablier.go index 2d46adb..36b697a 100644 --- a/app/sablier.go +++ b/app/sablier.go @@ -47,7 +47,7 @@ func Start(conf config.Config) error { loadSessions(storage, sessionsManager) } - http.Start(conf.Server, conf.Strategy, sessionsManager) + http.Start(conf.Server, conf.Strategy, conf.Sessions, sessionsManager) return nil } diff --git a/plugins/traefik/config.go b/plugins/traefik/config.go index c43cae0..11af3a7 100644 --- a/plugins/traefik/config.go +++ b/plugins/traefik/config.go @@ -80,13 +80,16 @@ func (c *Config) buildDynamicRequest(middlewareName string) (*http.Request, erro q := request.URL.Query() - _, err = time.ParseDuration(c.SessionDuration) + if c.SessionDuration != "" { + _, err = time.ParseDuration(c.SessionDuration) - if err != nil { - return nil, fmt.Errorf("error parsing dynamic.sessionDuration: %v", err) + if err != nil { + return nil, fmt.Errorf("error parsing dynamic.sessionDuration: %v", err) + } + + q.Add("session_duration", c.SessionDuration) } - q.Add("session_duration", c.SessionDuration) for _, name := range c.splittedNames { q.Add("names", name) } @@ -133,7 +136,16 @@ func (c *Config) buildBlockingRequest() (*http.Request, error) { q := request.URL.Query() - q.Add("session_duration", c.SessionDuration) + if c.SessionDuration != "" { + _, err = time.ParseDuration(c.SessionDuration) + + if err != nil { + return nil, fmt.Errorf("error parsing dynamic.sessionDuration: %v", err) + } + + q.Add("session_duration", c.SessionDuration) + } + for _, name := range c.splittedNames { q.Add("names", name) } diff --git a/plugins/traefik/config_test.go b/plugins/traefik/config_test.go index 9e306a9..229fd8d 100644 --- a/plugins/traefik/config_test.go +++ b/plugins/traefik/config_test.go @@ -26,6 +26,16 @@ func TestConfig_BuildRequest(t *testing.T) { want *http.Request wantErr bool }{ + { + name: "dynamic session with required values", + fields: fields{ + SablierURL: "http://sablier:10000", + Names: "nginx , apache", + Dynamic: &traefik.DynamicConfiguration{}, + }, + want: createRequest("GET", "http://sablier:10000/api/strategies/dynamic?display_name=sablier-middleware&names=nginx&names=apache", nil), + wantErr: false, + }, { name: "dynamic session with default values", fields: fields{ @@ -143,6 +153,16 @@ func TestConfig_BuildRequest(t *testing.T) { want: createRequest("GET", "http://sablier:10000/api/strategies/dynamic?display_name=sablier-middleware&names=nginx&names=apache&refresh_frequency=1m&session_duration=1m", nil), wantErr: false, }, + { + name: "blocking session with required values", + fields: fields{ + SablierURL: "http://sablier:10000", + Names: "nginx , apache", + Blocking: &traefik.BlockingConfiguration{}, + }, + want: createRequest("GET", "http://sablier:10000/api/strategies/blocking?names=nginx&names=apache", nil), + wantErr: false, + }, { name: "blocking session with default values", fields: fields{