diff --git a/pkg/nginx/getter.go b/pkg/nginx/getter.go index 9bb8a704..7a00074b 100644 --- a/pkg/nginx/getter.go +++ b/pkg/nginx/getter.go @@ -183,6 +183,21 @@ func (p *Parser) GetHTTPSRedirect() bool { return false } +func (p *Parser) GetAltSvc() string { + directive, err := p.FindOne("server.add_header") + if err != nil { + return "" + } + + for i, param := range directive.GetParameters() { + if strings.HasPrefix(param, "Alt-Svc") && i+1 < len(directive.GetParameters()) { + return directive.GetParameters()[i+1] + } + } + + return "" +} + func (p *Parser) GetAccessLog() (string, error) { directive, err := p.FindOne("server.access_log") if err != nil { diff --git a/pkg/nginx/parser_test.go b/pkg/nginx/parser_test.go index 9cfefa43..988320df 100644 --- a/pkg/nginx/parser_test.go +++ b/pkg/nginx/parser_test.go @@ -198,6 +198,17 @@ func (s *NginxTestSuite) TestHTTPSRedirect() { s.False(parser.GetHTTPSRedirect()) } +func (s *NginxTestSuite) TestAltSvc() { + parser, err := NewParser() + s.NoError(err) + s.NoError(parser.SetHTTPS("/www/server/vhost/cert/default.pem", "/www/server/vhost/cert/default.key")) + s.Equal("", parser.GetAltSvc()) + s.NoError(parser.SetAltSvc(`'h3=":$server_port"; ma=2592000'`)) + s.Equal(`'h3=":$server_port"; ma=2592000'`, parser.GetAltSvc()) + s.NoError(parser.SetAltSvc("")) + s.Equal("", parser.GetAltSvc()) +} + func (s *NginxTestSuite) TestAccessLog() { parser, err := NewParser() s.NoError(err) diff --git a/pkg/nginx/setter.go b/pkg/nginx/setter.go index 6f12560f..097712ab 100644 --- a/pkg/nginx/setter.go +++ b/pkg/nginx/setter.go @@ -425,6 +425,44 @@ func (p *Parser) SetHTTPRedirect(httpRedirect bool) error { return p.Set("server", directives) } +func (p *Parser) SetAltSvc(altSvc string) error { + old, err := p.Find("server.add_header") + if err != nil { + return err + } + if err = p.Clear("server.add_header"); err != nil { + return err + } + + var directives []*config.Directive + var foundFlag bool + for _, dir := range old { + if slices.Contains(dir.GetParameters(), "Alt-Svc") { + foundFlag = true + directives = append(directives, &config.Directive{ + Name: dir.GetName(), + Parameters: []string{"Alt-Svc", altSvc}, + Comment: dir.GetComment(), + }) + } else { + directives = append(directives, &config.Directive{ + Name: dir.GetName(), + Parameters: dir.GetParameters(), + Comment: dir.GetComment(), + }) + } + } + + if !foundFlag && altSvc != "" { + directives = append(directives, &config.Directive{ + Name: "add_header", + Parameters: []string{"Alt-Svc", altSvc}, + }) + } + + return p.Set("server", directives) +} + func (p *Parser) SetAccessLog(accessLog string) error { if err := p.Clear("server.access_log"); err != nil { return err