From b98f5ed8b1ed72b2b2af24814ac6922e1f531d81 Mon Sep 17 00:00:00 2001 From: Ludovic Fernandez Date: Tue, 4 Sep 2018 15:54:06 +0200 Subject: [PATCH 1/2] Remove a dead link. --- docs/configuration/api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/api.md b/docs/configuration/api.md index e6e8aa932..b9e8bf3ef 100644 --- a/docs/configuration/api.md +++ b/docs/configuration/api.md @@ -33,7 +33,7 @@ debug = true ``` -For more customization, see [entry points](/configuration/entrypoints/) documentation and [examples](/user-guide/examples/#ping-health-check). +For more customization, see [entry points](/configuration/entrypoints/) documentation. ## Web UI From 913d8737ccb53b0352917de3f32a92861dab6377 Mon Sep 17 00:00:00 2001 From: NicoMen Date: Tue, 4 Sep 2018 17:14:04 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Allow=20Tr=C3=A6fik=20to=20know=20if=20a=20?= =?UTF-8?q?Host=20rule=20is=20malformed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- provider/acme/provider.go | 2 +- rules/rules.go | 18 +++++++++++++++-- rules/rules_test.go | 41 ++++++++++++++++++++++++++++----------- server/server.go | 10 ++++++++-- 4 files changed, 55 insertions(+), 16 deletions(-) diff --git a/provider/acme/provider.go b/provider/acme/provider.go index 74adf62d4..9a876e3f7 100644 --- a/provider/acme/provider.go +++ b/provider/acme/provider.go @@ -181,7 +181,7 @@ func (p *Provider) watchNewDomains() { } if len(domains) == 0 { - log.Debugf("No domain parsed in rule %q", route.Rule) + log.Debugf("No domain parsed in rule %q in provider ACME", route.Rule) continue } diff --git a/rules/rules.go b/rules/rules.go index 3ea8fef24..b592d8bdc 100644 --- a/rules/rules.go +++ b/rules/rules.go @@ -9,7 +9,6 @@ import ( "sort" "strings" - "github.com/BurntSushi/ty/fun" "github.com/containous/mux" "github.com/containous/traefik/types" ) @@ -270,9 +269,11 @@ func (r *Rules) Parse(expression string) (*mux.Route, error) { // ParseDomains parses rules expressions and returns domains func (r *Rules) ParseDomains(expression string) ([]string, error) { var domains []string + isHostRule := false err := r.parseRules(expression, func(functionName string, function interface{}, arguments []string) error { if functionName == "Host" { + isHostRule = true domains = append(domains, arguments...) } return nil @@ -281,5 +282,18 @@ func (r *Rules) ParseDomains(expression string) ([]string, error) { return nil, fmt.Errorf("error parsing domains: %v", err) } - return fun.Map(types.CanonicalDomain, domains).([]string), nil + var cleanDomains []string + for _, domain := range domains { + canonicalDomain := types.CanonicalDomain(domain) + if len(canonicalDomain) > 0 { + cleanDomains = append(cleanDomains, canonicalDomain) + } + } + + // Return an error if an Host rule is detected but no domain are parsed + if isHostRule && len(cleanDomains) == 0 { + return nil, fmt.Errorf("unable to parse correctly the domains in the Host rule from %q", expression) + } + + return cleanDomains, nil } diff --git a/rules/rules_test.go b/rules/rules_test.go index fe40f8e26..7789456ae 100644 --- a/rules/rules_test.go +++ b/rules/rules_test.go @@ -54,24 +54,38 @@ func TestParseDomains(t *testing.T) { rules := &Rules{} tests := []struct { - expression string - domain []string + description string + expression string + domain []string + errorExpected bool }{ { - expression: "Host:foo.bar,test.bar", - domain: []string{"foo.bar", "test.bar"}, + description: "Many host rules", + expression: "Host:foo.bar,test.bar", + domain: []string{"foo.bar", "test.bar"}, + errorExpected: false, }, { - expression: "Path:/test", - domain: []string{}, + description: "No host rule", + expression: "Path:/test", + errorExpected: false, }, { - expression: "Host:foo.bar;Path:/test", - domain: []string{"foo.bar"}, + description: "Host rule and another rule", + expression: "Host:foo.bar;Path:/test", + domain: []string{"foo.bar"}, + errorExpected: false, }, { - expression: "Host: Foo.Bar ;Path:/test", - domain: []string{"foo.bar"}, + description: "Host rule to trim and another rule", + expression: "Host: Foo.Bar ;Path:/test", + domain: []string{"foo.bar"}, + errorExpected: false, + }, + { + description: "Host rule with no domain", + expression: "Host: ;Path:/test", + errorExpected: true, }, } @@ -81,7 +95,12 @@ func TestParseDomains(t *testing.T) { t.Parallel() domains, err := rules.ParseDomains(test.expression) - require.NoError(t, err, "%s: Error while parsing domain.", test.expression) + + if test.errorExpected { + require.Errorf(t, err, "unable to parse correctly the domains in the Host rule from %q", test.expression) + } else { + require.NoError(t, err, "%s: Error while parsing domain.", test.expression) + } assert.EqualValues(t, test.domain, domains, "%s: Error parsing domains from expression.", test.expression) }) diff --git a/server/server.go b/server/server.go index 5db244e92..5199c1965 100644 --- a/server/server.go +++ b/server/server.go @@ -676,9 +676,15 @@ func (s *Server) postLoadConfiguration() { domains, err := rules.ParseDomains(route.Rule) if err != nil { log.Errorf("Error parsing domains: %v", err) - } else { - s.globalConfiguration.ACME.LoadCertificateForDomains(domains) + continue } + + if len(domains) == 0 { + log.Debugf("No domain parsed in rule %q", route.Rule) + continue + } + + s.globalConfiguration.ACME.LoadCertificateForDomains(domains) } } }