Skip to content

Commit f69f28e

Browse files
committed
feat(linters): add new linter canonicalheader
Canonicalheader checks http header via http.CanonicalHeaderKey().
1 parent 95fc378 commit f69f28e

File tree

7 files changed

+61
-0
lines changed

7 files changed

+61
-0
lines changed

.golangci.reference.yml

+2
Original file line numberDiff line numberDiff line change
@@ -2514,6 +2514,7 @@ linters:
25142514
- asciicheck
25152515
- bidichk
25162516
- bodyclose
2517+
- canonicalheader
25172518
- containedctx
25182519
- contextcheck
25192520
- copyloopvar
@@ -2627,6 +2628,7 @@ linters:
26272628
- asciicheck
26282629
- bidichk
26292630
- bodyclose
2631+
- canonicalheader
26302632
- containedctx
26312633
- contextcheck
26322634
- copyloopvar

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ require (
6565
github.com/kulti/thelper v0.6.3
6666
github.com/kunwardeep/paralleltest v1.0.10
6767
github.com/kyoh86/exportloopref v0.1.11
68+
github.com/lasiar/canonicalheader v1.0.5
6869
github.com/ldez/gomoddirectives v0.2.4
6970
github.com/ldez/tagliatelle v0.5.0
7071
github.com/leonklingele/grouper v1.1.2

go.sum

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package canonicalheader
2+
3+
import (
4+
"github.com/lasiar/canonicalheader"
5+
"golang.org/x/tools/go/analysis"
6+
7+
"github.com/golangci/golangci-lint/pkg/goanalysis"
8+
)
9+
10+
func New() *goanalysis.Linter {
11+
a := canonicalheader.Analyzer
12+
13+
return goanalysis.NewLinter(
14+
a.Name,
15+
a.Doc,
16+
[]*analysis.Analyzer{canonicalheader.Analyzer},
17+
nil,
18+
).WithLoadMode(goanalysis.LoadModeTypesInfo)
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package canonicalheader_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/golangci/golangci-lint/test/testshared/integration"
7+
)
8+
9+
func TestFromTestdata(t *testing.T) {
10+
integration.RunTestdata(t)
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//golangcitest:args -Ecanonicalheader
2+
package testdata
3+
4+
import "net/http"
5+
6+
func canonicalheader() {
7+
v := http.Header{}
8+
9+
v.Get("Test-HEader") // want `non-canonical header "Test-HEader", instead use: "Test-Header"`
10+
v.Set("Test-HEader", "value") // want `non-canonical header "Test-HEader", instead use: "Test-Header"`
11+
v.Add("Test-HEader", "value") // want `non-canonical header "Test-HEader", instead use: "Test-Header"`
12+
v.Del("Test-HEader") // want `non-canonical header "Test-HEader", instead use: "Test-Header"`
13+
v.Values("Test-HEader") // want `non-canonical header "Test-HEader", instead use: "Test-Header"`
14+
15+
v.Set("Test-Header", "value")
16+
v.Add("Test-Header", "value")
17+
v.Del("Test-Header")
18+
v.Values("Test-Header")
19+
}

pkg/lint/lintersdb/builder_linter.go

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/golangci/golangci-lint/pkg/golinters/asciicheck"
88
"github.com/golangci/golangci-lint/pkg/golinters/bidichk"
99
"github.com/golangci/golangci-lint/pkg/golinters/bodyclose"
10+
"github.com/golangci/golangci-lint/pkg/golinters/canonicalheader"
1011
"github.com/golangci/golangci-lint/pkg/golinters/containedctx"
1112
"github.com/golangci/golangci-lint/pkg/golinters/contextcheck"
1213
"github.com/golangci/golangci-lint/pkg/golinters/copyloopvar"
@@ -823,6 +824,12 @@ func (LinterBuilder) Build(cfg *config.Config) ([]*linter.Config, error) {
823824
WithLoadForGoAnalysis().
824825
WithURL("https://github.com/ykadowak/zerologlint"),
825826

827+
linter.NewConfig(canonicalheader.New()).
828+
WithSince("v1.58.0").
829+
WithPresets(linter.PresetStyle).
830+
WithLoadForGoAnalysis().
831+
WithURL("https://github.com/lasiar/canonicalHeader"),
832+
826833
// nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives
827834
linter.NewConfig(nolintlint.New(&cfg.LintersSettings.NoLintLint)).
828835
WithSince("v1.26.0").

0 commit comments

Comments
 (0)