aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/lasiar
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2024-09-10 12:16:33 +0200
committerTaras Madan <tarasmadan@google.com>2024-09-10 14:05:26 +0000
commitc97c816133b42257d0bcf1ee4bd178bb2a7a2b9e (patch)
tree0bcbc2e540bbf8f62f6c17887cdd53b8c2cee637 /vendor/github.com/lasiar
parent54e657429ab892ad06c90cd7c1a4eb33ba93a3dc (diff)
vendor: update
Diffstat (limited to 'vendor/github.com/lasiar')
-rw-r--r--vendor/github.com/lasiar/canonicalheader/.gitignore1
-rw-r--r--vendor/github.com/lasiar/canonicalheader/.golangci.yaml802
-rw-r--r--vendor/github.com/lasiar/canonicalheader/.goreleaser.yaml18
-rw-r--r--vendor/github.com/lasiar/canonicalheader/LICENCE21
-rw-r--r--vendor/github.com/lasiar/canonicalheader/README.md77
-rw-r--r--vendor/github.com/lasiar/canonicalheader/analyzer.go264
-rw-r--r--vendor/github.com/lasiar/canonicalheader/constant_string.go50
-rw-r--r--vendor/github.com/lasiar/canonicalheader/initialism.go75
-rw-r--r--vendor/github.com/lasiar/canonicalheader/literal_string.go80
-rw-r--r--vendor/github.com/lasiar/canonicalheader/makefile12
10 files changed, 1400 insertions, 0 deletions
diff --git a/vendor/github.com/lasiar/canonicalheader/.gitignore b/vendor/github.com/lasiar/canonicalheader/.gitignore
new file mode 100644
index 000000000..723ef36f4
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/.gitignore
@@ -0,0 +1 @@
+.idea \ No newline at end of file
diff --git a/vendor/github.com/lasiar/canonicalheader/.golangci.yaml b/vendor/github.com/lasiar/canonicalheader/.golangci.yaml
new file mode 100644
index 000000000..5652c8d6c
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/.golangci.yaml
@@ -0,0 +1,802 @@
+# See: https://olegk.dev/go-linters-configuration-the-right-version
+
+run:
+ # Automatically adjust the maximum concurrency to the container CPU quota.
+ concurrency: 0
+
+ # I really care about the result, so I'm fine to wait for it.
+ timeout: 30m
+
+ # Fail if the error was met.
+ issues-exit-code: 1
+
+ # This is very important, bugs in tests are not acceptable either.
+ tests: true
+
+ # In most cases this can be empty but there is a popular pattern
+ # to keep integration tests under this tag. Such tests often require
+ # additional setups like Postgres, Redis etc and are run separately.
+ # (to be honest I don't find this useful but I have such tags)
+ build-tags:
+ - integration
+
+ # Autogenerated files can be skipped (I'm looking at you gRPC).
+ # AFAIK autogen files are skipped but skipping the whole directory should be somewhat faster.
+ #skip-files:
+ # - "protobuf/.*.go"
+
+ # With the read-only mode linter will fail if go.mod file is outdated.
+ modules-download-mode: readonly
+
+ # Till today I didn't know this param exists, never ran 2 golangci-lint at once.
+ allow-parallel-runners: false
+
+ # Keep this empty to use the Go version from the go.mod file.
+ go: ""
+
+linters:
+ # Set to true runs only fast linters.
+ # Good option for 'lint on save', pre-commit hook or CI.
+ fast: false
+
+ enable:
+ # Check for pass []any as any in variadic func(...any).
+ # Rare case but saved me from debugging a few times.
+ - asasalint
+
+ # I prefer plane ASCII identifiers.
+ # Symbol `∆` instead of `delta` looks cool but no thanks.
+ - asciicheck
+
+ # Checks for dangerous unicode character sequences.
+ # Super rare but why not to be a bit paranoid?
+ - bidichk
+
+ # Checks whether HTTP response body is closed successfully.
+ - bodyclose
+
+ # Check whether the function uses a non-inherited context.
+ - contextcheck
+
+ # Check for two durations multiplied together.
+ - durationcheck
+
+ # Forces to not skip error check.
+ - errcheck
+
+ # Checks `Err-` prefix for var and `-Error` suffix for error type.
+ - errname
+
+ # Suggests to use `%w` for error-wrapping.
+ - errorlint
+
+ # Checks for pointers to enclosing loop variables.
+ - exportloopref
+
+ # As you already know I'm a co-author. It would be strange to not use
+ # one of my warmly loved projects.
+ - gocritic
+
+ # Forces to put `.` at the end of the comment. Code is poetry.
+ - godot
+
+ # Might not be that important but I prefer to keep all of them.
+ # `gofumpt` is amazing, kudos to Daniel Marti https://github.com/mvdan/gofumpt
+ - gofmt
+ - gofumpt
+ - goimports
+
+ # Allow or ban replace directives in go.mod
+ # or force explanation for retract directives.
+ - gomoddirectives
+
+ # Powerful security-oriented linter. But requires some time to
+ # configure it properly, see https://github.com/securego/gosec#available-rules
+ - gosec
+
+ # Linter that specializes in simplifying code.
+ - gosimple
+
+ # Official Go tool. Must have.
+ - govet
+
+ # Detects when assignments to existing variables are not used
+ # Last week I caught a bug with it.
+ - ineffassign
+
+ # Fix all the misspells, amazing thing.
+ - misspell
+
+ # Finds naked/bare returns and requires change them.
+ - nakedret
+
+ # Both require a bit more explicit returns.
+ - nilerr
+ - nilnil
+
+ # Finds sending HTTP request without context.Context.
+ - noctx
+
+ # Forces comment why another check is disabled.
+ # Better not to have //nolint: at all ;)
+ - nolintlint
+
+ # Finds slices that could potentially be pre-allocated.
+ # Small performance win + cleaner code.
+ - prealloc
+
+ # Finds shadowing of Go's predeclared identifiers.
+ # I hear a lot of complaints from junior developers.
+ # But after some time they find it very useful.
+ - predeclared
+
+ # Lint your Prometheus metrics name.
+ - promlinter
+
+ # Checks that package variables are not reassigned.
+ # Super rare case but can catch bad things (like `io.EOF = nil`)
+ - reassign
+
+ # Drop-in replacement of `golint`.
+ - revive
+
+ # Somewhat similar to `bodyclose` but for `database/sql` package.
+ - rowserrcheck
+ - sqlclosecheck
+
+ # I have found that it's not the same as staticcheck binary :\
+ - staticcheck
+
+ # Is a replacement for `golint`, similar to `revive`.
+ - stylecheck
+
+ # Check struct tags.
+ - tagliatelle
+
+ # Test-related checks. All of them are good.
+ - tenv
+ - testableexamples
+ - thelper
+ - tparallel
+
+ # Remove unnecessary type conversions, make code cleaner
+ - unconvert
+
+ # Might be noisy but better to know what is unused
+ - unparam
+
+ # Must have. Finds unused declarations.
+ - unused
+
+ # Detect the possibility to use variables/constants from stdlib.
+ - usestdlibvars
+
+ # Finds wasted assignment statements.
+ - wastedassign
+
+ disable:
+ # Detects struct contained context.Context field. Not a problem.
+ - containedctx
+
+ # Checks function and package cyclomatic complexity.
+ # I can have a long but trivial switch-case.
+ #
+ # Cyclomatic complexity is a measurement, not a goal.
+ # (c) Bryan C. Mills / https://github.com/bcmills
+ - cyclop
+
+ # Abandoned, replaced by `unused`.
+ - deadcode
+
+ # Check declaration order of types, consts, vars and funcs.
+ # I like it but I don't use it.
+ - decorder
+
+ # Checks if package imports are in a list of acceptable packages.
+ # I'm very picky about what I import, so no automation.
+ - depguard
+
+ # Checks assignments with too many blank identifiers. Very rare.
+ - dogsled
+
+ # Tool for code clone detection.
+ - dupl
+
+ # Find duplicate words, rare.
+ - dupword
+
+ # I'm fine to check the error from json.Marshal ¯\_(ツ)_/¯
+ - errchkjson
+
+ # All SQL queries MUST BE covered with tests.
+ - execinquery
+
+ # Forces to handle more cases. Cool but noisy.
+ - exhaustive
+ - exhaustivestruct # Deprecated, replaced by check below.
+ - exhaustruct
+
+ # Forbids some identifiers. I don't have a case for it.
+ - forbidigo
+
+ # Finds forced type assertions, very good for juniors.
+ - forcetypeassert
+
+ # I might have long but a simple function.
+ - funlen
+
+ # Imports order. I do this manually ¯\_(ツ)_/¯
+ - gci
+
+ # I'm not a fan of ginkgo and gomega packages.
+ - ginkgolinter
+
+ # Checks that compiler directive comments (//go:) are valid. Rare.
+ - gocheckcompilerdirectives
+
+ # Globals and init() are ok.
+ - gochecknoglobals
+ - gochecknoinits
+
+ # Same as `cyclop` linter (see above)
+ - gocognit
+ - goconst
+ - gocyclo
+
+ # TODO and friends are ok.
+ - godox
+
+ # Check the error handling expressions. Too noisy.
+ - goerr113
+
+ # I don't use file headers.
+ - goheader
+
+ # 1st Go linter, deprecated :( use `revive`.
+ - golint
+
+ # Reports magic consts. Might be noisy but still good.
+ - gomnd
+
+ # Allowed/blocked packages to import. I prefer to do it manually.
+ - gomodguard
+
+ # Printf-like functions must have -f.
+ - goprintffuncname
+
+ # Groupt declarations, I prefer manually.
+ - grouper
+
+ # Deprecated.
+ - ifshort
+
+ # Checks imports aliases, rare.
+ - importas
+
+ # Forces tiny interfaces, very subjective.
+ - interfacebloat
+
+ # Accept interfaces, return types. Not always.
+ - ireturn
+
+ # I don't set line length. 120 is fine by the way ;)
+ - lll
+
+ # Some log checkers, might be useful.
+ - loggercheck
+
+ # Maintainability index of each function, subjective.
+ - maintidx
+
+ # Slice declarations with non-zero initial length. Not my case.
+ - makezero
+
+ # Deprecated. Use govet `fieldalignment`.
+ - maligned
+
+ # Enforce tags in un/marshaled structs. Cool but not my case.
+ - musttag
+
+ # Deeply nested if statements, subjective.
+ - nestif
+
+ # Forces newlines in some places.
+ - nlreturn
+
+ # Reports all named returns, not that bad.
+ - nonamedreturns
+
+ # Deprecated. Replaced by `revive`.
+ - nosnakecase
+
+ # Finds misuse of Sprintf with host:port in a URL. Cool but rare.
+ - nosprintfhostport
+
+ # I don't use t.Parallel() that much.
+ - paralleltest
+
+ # Often non-`_test` package is ok.
+ - testpackage
+
+ # Compiler can do it too :)
+ - typecheck
+
+ # I'm fine with long variable names with a small scope.
+ - varnamelen
+
+ # gofmt,gofumpt covers that (from what I know).
+ - whitespace
+
+ # Don't find it useful to wrap all errors from external packages.
+ - wrapcheck
+
+ # Forces you to use empty lines. Great if configured correctly.
+ # I mean there is an agreement in a team.
+ - wsl
+
+linters-settings:
+ revive:
+ # Maximum number of open files at the same time.
+ # See https://github.com/mgechev/revive#command-line-flags
+ # Defaults to unlimited.
+ max-open-files: 2048
+ # When set to false, ignores files with "GENERATED" header, similar to golint.
+ # See https://github.com/mgechev/revive#available-rules for details.
+ # Default: false
+ ignore-generated-header: true
+ # Sets the default severity.
+ # See https://github.com/mgechev/revive#configuration
+ # Default: warning
+ severity: error
+ # Enable all available rules.
+ # Default: false
+ enable-all-rules: true
+ # Sets the default failure confidence.
+ # This means that linting errors with less than 0.8 confidence will be ignored.
+ # Default: 0.8
+ confidence: 0.1
+ rules:
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#add-constant
+ - name: add-constant
+ severity: warning
+ disabled: false
+ arguments:
+ - maxLitCount: "3"
+ allowStrs: '""'
+ allowInts: "0,1,2"
+ allowFloats: "0.0,0.,1.0,1.,2.0,2."
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#argument-limit
+ - name: argument-limit
+ severity: warning
+ disabled: false
+ arguments: [4]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#atomic
+ - name: atomic
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#banned-characters
+ - name: banned-characters
+ severity: warning
+ disabled: false
+ arguments: ["Ω", "Σ", "σ", "7"]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#bare-return
+ - name: bare-return
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#blank-imports
+ - name: blank-imports
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#bool-literal-in-expr
+ - name: bool-literal-in-expr
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#call-to-gc
+ - name: call-to-gc
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cognitive-complexity
+ - name: cognitive-complexity
+ severity: warning
+ disabled: true
+ arguments: [7]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#comment-spacings
+ - name: comment-spacings
+ severity: warning
+ disabled: false
+ arguments:
+ - mypragma
+ - otherpragma
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#confusing-naming
+ - name: confusing-naming
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#confusing-results
+ - name: confusing-results
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#constant-logical-expr
+ - name: constant-logical-expr
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument
+ - name: context-as-argument
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-keys-type
+ - name: context-keys-type
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#cyclomatic
+ - name: cyclomatic
+ severity: warning
+ disabled: true
+ arguments: [3]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#datarace
+ - name: datarace
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#deep-exit
+ - name: deep-exit
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#defer
+ - name: defer
+ severity: warning
+ disabled: false
+ arguments:
+ - ["call-chain", "loop"]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#dot-imports
+ - name: dot-imports
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#duplicated-imports
+ - name: duplicated-imports
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#early-return
+ - name: early-return
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-block
+ - name: empty-block
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-lines
+ - name: empty-lines
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#enforce-map-style
+ - name: enforce-map-style
+ severity: warning
+ disabled: false
+ arguments:
+ - "make"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-naming
+ - name: error-naming
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-return
+ - name: error-return
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#function-length
+ - name: function-length
+ severity: warning
+ disabled: true
+ arguments: [10, 0]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-strings
+ - name: error-strings
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#errorf
+ - name: errorf
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#exported
+ - name: exported
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#file-header
+ - name: file-header
+ severity: warning
+ disabled: true
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#flag-parameter
+ - name: flag-parameter
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#function-result-limit
+ - name: function-result-limit
+ severity: warning
+ disabled: false
+ arguments: [2]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#get-return
+ - name: get-return
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#identical-branches
+ - name: identical-branches
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#if-return
+ - name: if-return
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#increment-decrement
+ - name: increment-decrement
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#indent-error-flow
+ - name: indent-error-flow
+ severity: warning
+ disabled: false
+ arguments:
+ - "preserveScope"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#import-alias-naming
+ - name: import-alias-naming
+ severity: warning
+ disabled: false
+ arguments:
+ - "^[a-z][a-z0-9]{0,}$"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#imports-blacklist
+ - name: imports-blacklist
+ severity: warning
+ disabled: false
+ arguments:
+ - "crypto/md5"
+ - "crypto/sha1"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#import-shadowing
+ - name: import-shadowing
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#line-length-limit
+ - name: line-length-limit
+ severity: warning
+ disabled: true
+ arguments: [80]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#max-public-structs
+ - name: max-public-structs
+ severity: warning
+ disabled: false
+ arguments: [3]
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#modifies-parameter
+ - name: modifies-parameter
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#modifies-value-receiver
+ - name: modifies-value-receiver
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#nested-structs
+ - name: nested-structs
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#optimize-operands-order
+ - name: optimize-operands-order
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#package-comments
+ - name: package-comments
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range
+ - name: range
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-in-closure
+ - name: range-val-in-closure
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-address
+ - name: range-val-address
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#receiver-naming
+ - name: receiver-naming
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#redundant-import-alias
+ - name: redundant-import-alias
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#redefines-builtin-id
+ - name: redefines-builtin-id
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-of-int
+ - name: string-of-int
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-format
+ - name: string-format
+ severity: warning
+ disabled: false
+ arguments:
+ - - 'core.WriteError[1].Message'
+ - '/^([^A-Z]|$)/'
+ - must not start with a capital letter
+ - - 'fmt.Errorf[0]'
+ - '/(^|[^\.!?])$/'
+ - must not end in punctuation
+ - - panic
+ - '/^[^\n]*$/'
+ - must not contain line breaks
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#struct-tag
+ - name: struct-tag
+ arguments:
+ - "json,inline"
+ - "bson,outline,gnu"
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#superfluous-else
+ - name: superfluous-else
+ severity: warning
+ disabled: false
+ arguments:
+ - "preserveScope"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#time-equal
+ - name: time-equal
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#time-naming
+ - name: time-naming
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-naming
+ - name: var-naming
+ severity: warning
+ disabled: false
+ arguments:
+ - ["ID"] # AllowList
+ - ["VM"] # DenyList
+ - - upperCaseConst: true
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-declaration
+ - name: var-declaration
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unconditional-recursion
+ - name: unconditional-recursion
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-naming
+ - name: unexported-naming
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-return
+ - name: unexported-return
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unhandled-error
+ - name: unhandled-error
+ severity: warning
+ disabled: false
+ arguments:
+ - "fmt.Printf"
+ - "myFunction"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unnecessary-stmt
+ - name: unnecessary-stmt
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unreachable-code
+ - name: unreachable-code
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-parameter
+ - name: unused-parameter
+ severity: warning
+ disabled: false
+ arguments:
+ - allowRegex: "^_"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unused-receiver
+ - name: unused-receiver
+ severity: warning
+ disabled: false
+ arguments:
+ - allowRegex: "^_"
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#useless-break
+ - name: useless-break
+ severity: warning
+ disabled: false
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#waitgroup-by-value
+ - name: waitgroup-by-value
+ severity: warning
+ disabled: false
+ # I'm biased and I'm enabling more than 100 checks
+ # Might be too much for you. See https://go-critic.com/overview.html
+ gocritic:
+ enabled-tags:
+ - diagnostic
+ - experimental
+ - opinionated
+ - performance
+ - style
+ disabled-checks:
+ # These 3 will detect many cases, but they do sense
+ # if it's performance oriented code
+ - hugeParam
+ - rangeExprCopy
+ - rangeValCopy
+
+ godot:
+ scope: all
+
+ errcheck:
+ # Report `a := b.(MyStruct)` when `a, ok := ...` should be.
+ check-type-assertions: true # Default: false
+
+ # Report skipped checks:`num, _ := strconv.Atoi(numStr)`.
+ check-blank: true # Default: false
+
+ # Function to skip.
+ exclude-functions:
+ - io/ioutil.ReadFile
+ - io.Copy(*bytes.Buffer)
+ - io.Copy(os.Stdout)
+
+ govet:
+ disable:
+ - fieldalignment # I'm ok to waste some bytes
+
+ nakedret:
+ # No naked returns, ever.
+ max-func-lines: 1 # Default: 30
+
+ tagliatelle:
+ case:
+ rules:
+ json: snake # why it's not a `snake` by default?!
+ yaml: snake # why it's not a `snake` by default?!
+ xml: camel
+ bson: camel
+ avro: snake
+ mapstructure: kebab
+
+# See also https://gist.github.com/cristaloleg/dc29ca0ef2fb554de28d94c3c6f6dc88
+
+output:
+ # I prefer the simplest one: `line-number` and saving to `lint.txt`
+ #
+ # The `tab` also looks good and with the next release I will switch to it
+ # (ref: https://github.com/golangci/golangci-lint/issues/3728)
+ #
+ # There are more formats which can be used on CI or by your IDE.
+ formats:
+ - format: line-number
+
+ # I do not find this useful, parameter above already enables filepath
+ # with a line and column. For me, it's easier to follow the path and
+ # see the line in an IDE where I see more code and understand it better.
+ print-issued-lines: false
+
+ # Must have. Easier to understand the output.
+ print-linter-name: true
+
+ # No, no skips, everything should be reported.
+ uniq-by-line: false
+
+ # To be honest no idea when this can be needed, maybe a multi-module setup?
+ path-prefix: ""
+
+ # Slightly easier to follow the results + getting deterministic output.
+ sort-results: true
+
+issues:
+ exclude-dirs-use-default: false
+ # I found it strange to skip the errors, setting 0 to have all the results.
+ max-issues-per-linter: 0
+
+ # Same here, nothing should be skipped to not miss errors.
+ max-same-issues: 0
+
+ # When set to `true` linter will analyze only new code which are
+ # not committed or after some specific revision. This is a cool
+ # feature when you're going to introduce linter into a big project.
+ # But I prefer going gradually package by package.
+ # So, it's set to `false` to scan all code.
+ new: false
+
+ # 2 other params regarding git integration
+
+ # Even with a recent GPT-4 release I still believe that
+ # I know better how to do my job and fix the suggestions.
+ fix: false \ No newline at end of file
diff --git a/vendor/github.com/lasiar/canonicalheader/.goreleaser.yaml b/vendor/github.com/lasiar/canonicalheader/.goreleaser.yaml
new file mode 100644
index 000000000..ada67063e
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/.goreleaser.yaml
@@ -0,0 +1,18 @@
+builds:
+ - main: ./cmd/canonicalheader
+ env:
+ - CGO_ENABLED=0
+ flags:
+ - -trimpath
+ ldflags:
+ - -s -w
+ targets:
+ - darwin_amd64
+ - darwin_arm64
+ - linux_amd64
+ - windows_amd64
+
+archives:
+ - format_overrides:
+ - goos: windows
+ format: zip \ No newline at end of file
diff --git a/vendor/github.com/lasiar/canonicalheader/LICENCE b/vendor/github.com/lasiar/canonicalheader/LICENCE
new file mode 100644
index 000000000..5b93b736c
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/LICENCE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Roman Chaliy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. \ No newline at end of file
diff --git a/vendor/github.com/lasiar/canonicalheader/README.md b/vendor/github.com/lasiar/canonicalheader/README.md
new file mode 100644
index 000000000..997145219
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/README.md
@@ -0,0 +1,77 @@
+# canonicalheader
+
+[![CI](https://github.com/lasiar/canonicalheader/actions/workflows/test.yml/badge.svg)](https://github.com/lasiar/canonicalheader/actions/workflows/test.yml)
+[![tag](https://img.shields.io/github/tag/lasiar/canonicalheader.svg)](https://github.com/lasiar/canonicalheader/releases)
+[![Go Report Card](https://goreportcard.com/badge/github.com/lasiar/canonicalheader)](https://goreportcard.com/report/github.com/lasiar/canonicalheader)
+[![License](https://img.shields.io/github/license/lasiar/canonicalheader)](./LICENCE)
+
+Golang linter for check canonical header.
+
+### Install
+
+```shell
+go install -v github.com/lasiar/canonicalheader/cmd/canonicalheader@latest
+```
+
+Or download the binary file from the [release](https://github.com/lasiar/canonicalheader/releases/latest).
+
+
+### Example
+
+before
+
+```go
+package main
+
+import (
+ "net/http"
+)
+
+const testHeader = "testHeader"
+
+func main() {
+ v := http.Header{}
+ v.Get(testHeader)
+
+ v.Get("Test-HEader")
+ v.Set("Test-HEader", "value")
+ v.Add("Test-HEader", "value")
+ v.Del("Test-HEader")
+ v.Values("Test-HEader")
+
+ v.Set("Test-Header", "value")
+ v.Add("Test-Header", "value")
+ v.Del("Test-Header")
+ v.Values("Test-Header")
+}
+
+```
+
+after
+
+```go
+package main
+
+import (
+ "net/http"
+)
+
+const testHeader = "testHeader"
+
+func main() {
+ v := http.Header{}
+ v.Get(testHeader)
+
+ v.Get("Test-Header")
+ v.Set("Test-Header", "value")
+ v.Add("Test-Header", "value")
+ v.Del("Test-Header")
+ v.Values("Test-Header")
+
+ v.Set("Test-Header", "value")
+ v.Add("Test-Header", "value")
+ v.Del("Test-Header")
+ v.Values("Test-Header")
+}
+
+```
diff --git a/vendor/github.com/lasiar/canonicalheader/analyzer.go b/vendor/github.com/lasiar/canonicalheader/analyzer.go
new file mode 100644
index 000000000..d3fb529eb
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/analyzer.go
@@ -0,0 +1,264 @@
+package canonicalheader
+
+import (
+ "fmt"
+ "go/ast"
+ "go/types"
+ "net/http"
+
+ "github.com/go-toolsmith/astcast"
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+ "golang.org/x/tools/go/ast/inspector"
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+const (
+ pkgPath = "net/http"
+ name = "Header"
+)
+
+var Analyzer = &analysis.Analyzer{
+ Name: "canonicalheader",
+ Doc: "canonicalheader checks whether net/http.Header uses canonical header",
+ Run: run,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+}
+
+type argumenter interface {
+ diagnostic(canonicalHeader string) analysis.Diagnostic
+ value() string
+}
+
+func run(pass *analysis.Pass) (any, error) {
+ var headerObject types.Object
+ for _, object := range pass.TypesInfo.Uses {
+ if object.Pkg() != nil &&
+ object.Pkg().Path() == pkgPath &&
+ object.Name() == name {
+ headerObject = object
+ break
+ }
+ }
+
+ if headerObject == nil {
+ //nolint:nilnil // nothing to do here, because http.Header{} not usage.
+ return nil, nil
+ }
+
+ spctor, ok := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
+ if !ok {
+ return nil, fmt.Errorf("want %T, got %T", spctor, pass.ResultOf[inspect.Analyzer])
+ }
+
+ wellKnownHeaders := initialism()
+
+ nodeFilter := []ast.Node{
+ (*ast.CallExpr)(nil),
+ }
+ var outerErr error
+
+ spctor.Preorder(nodeFilter, func(n ast.Node) {
+ if outerErr != nil {
+ return
+ }
+
+ callExp, ok := n.(*ast.CallExpr)
+ if !ok {
+ return
+ }
+
+ var (
+ // gotType type receiver.
+ gotType types.Type
+ gotMethodName string
+ )
+
+ switch t := typeutil.Callee(pass.TypesInfo, callExp).(type) {
+ // Direct call method.
+ case *types.Func:
+ fn := t
+ // Find net/http.Header{} by function call.
+ signature, ok := fn.Type().(*types.Signature)
+ if !ok {
+ return
+ }
+
+ recv := signature.Recv()
+
+ // It's a func, not a method.
+ if recv == nil {
+ return
+ }
+ gotType = recv.Type()
+ gotMethodName = astcast.ToSelectorExpr(callExp.Fun).Sel.Name
+
+ // h := http.Header{}
+ // f := h.Get
+ // v("Test-Value").
+ case *types.Var:
+ ident, ok := callExp.Fun.(*ast.Ident)
+ if !ok {
+ return
+ }
+
+ if ident.Obj == nil {
+ return
+ }
+
+ // f := h.Get.
+ assign, ok := ident.Obj.Decl.(*ast.AssignStmt)
+ if !ok {
+ return
+ }
+
+ // For case `i, v := 0, h.Get`.
+ // indexAssign--^.
+ indexAssign := -1
+ for i, lh := range assign.Lhs {
+ // Find by name of variable.
+ if astcast.ToIdent(lh).Name == ident.Name {
+ indexAssign = i
+ }
+ }
+
+ // Not found.
+ if indexAssign == -1 {
+ return
+ }
+
+ if len(assign.Rhs) <= indexAssign {
+ return
+ }
+
+ sel, ok := assign.Rhs[indexAssign].(*ast.SelectorExpr)
+ if !ok {
+ return
+ }
+
+ gotMethodName = sel.Sel.Name
+ ident, ok = sel.X.(*ast.Ident)
+ if !ok {
+ return
+ }
+
+ obj := pass.TypesInfo.ObjectOf(ident)
+ gotType = obj.Type()
+
+ default:
+ return
+ }
+
+ // It is not net/http.Header{}.
+ if !types.Identical(gotType, headerObject.Type()) {
+ return
+ }
+
+ // Search for known methods where the key is the first arg.
+ if !isValidMethod(gotMethodName) {
+ return
+ }
+
+ // Should be more than one. Because get the value by index it
+ // will not be superfluous.
+ if len(callExp.Args) == 0 {
+ return
+ }
+
+ callArg := callExp.Args[0]
+
+ // Check for type casting from myString to string.
+ // it could be: Get(string(string(string(myString)))).
+ // need this node------------------------^^^^^^^^.
+ for {
+ // If it is not *ast.CallExpr, this is a value.
+ c, ok := callArg.(*ast.CallExpr)
+ if !ok {
+ break
+ }
+
+ // Some function is called, skip this case.
+ if len(c.Args) == 0 {
+ return
+ }
+
+ f, ok := c.Fun.(*ast.Ident)
+ if !ok {
+ break
+ }
+
+ obj := pass.TypesInfo.ObjectOf(f)
+ // nil may be by code, but not by logic.
+ // TypeInfo should contain of type.
+ if obj == nil {
+ break
+ }
+
+ // This is function.
+ // Skip this method call.
+ _, ok = obj.Type().(*types.Signature)
+ if ok {
+ return
+ }
+
+ callArg = c.Args[0]
+ }
+
+ var arg argumenter
+ switch t := callArg.(type) {
+ case *ast.BasicLit:
+ lString, err := newLiteralString(t)
+ if err != nil {
+ return
+ }
+
+ arg = lString
+
+ case *ast.Ident:
+ constString, err := newConstantKey(pass.TypesInfo, t)
+ if err != nil {
+ return
+ }
+
+ arg = constString
+
+ default:
+ return
+ }
+
+ argValue := arg.value()
+ headerKeyCanonical := http.CanonicalHeaderKey(argValue)
+ if argValue == headerKeyCanonical {
+ return
+ }
+
+ headerKeyCanonical, isWellKnown := canonicalHeaderKey(argValue, wellKnownHeaders)
+ if argValue == headerKeyCanonical || isWellKnown {
+ return
+ }
+
+ pass.Report(arg.diagnostic(headerKeyCanonical))
+ })
+
+ return nil, outerErr
+}
+
+func canonicalHeaderKey(s string, m map[string]string) (string, bool) {
+ canonical := http.CanonicalHeaderKey(s)
+
+ wellKnown, ok := m[canonical]
+ if !ok {
+ return canonical, ok
+ }
+
+ return wellKnown, ok
+}
+
+func isValidMethod(name string) bool {
+ switch name {
+ case "Get", "Set", "Add", "Del", "Values":
+ return true
+ default:
+ return false
+ }
+}
diff --git a/vendor/github.com/lasiar/canonicalheader/constant_string.go b/vendor/github.com/lasiar/canonicalheader/constant_string.go
new file mode 100644
index 000000000..27988f0d5
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/constant_string.go
@@ -0,0 +1,50 @@
+package canonicalheader
+
+import (
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/analysis"
+)
+
+type constantString struct {
+ originalValue,
+ nameOfConst string
+
+ pos token.Pos
+ end token.Pos
+}
+
+func newConstantKey(info *types.Info, ident *ast.Ident) (constantString, error) {
+ c, ok := info.ObjectOf(ident).(*types.Const)
+ if !ok {
+ return constantString{}, fmt.Errorf("type %T is not support", c)
+ }
+
+ return constantString{
+ nameOfConst: c.Name(),
+ originalValue: constant.StringVal(c.Val()),
+ pos: ident.Pos(),
+ end: ident.End(),
+ }, nil
+}
+
+func (c constantString) diagnostic(canonicalHeader string) analysis.Diagnostic {
+ return analysis.Diagnostic{
+ Pos: c.pos,
+ End: c.end,
+ Message: fmt.Sprintf(
+ "const %q used as a key at http.Header, but %q is not canonical, want %q",
+ c.nameOfConst,
+ c.originalValue,
+ canonicalHeader,
+ ),
+ }
+}
+
+func (c constantString) value() string {
+ return c.originalValue
+}
diff --git a/vendor/github.com/lasiar/canonicalheader/initialism.go b/vendor/github.com/lasiar/canonicalheader/initialism.go
new file mode 100644
index 000000000..c3d91c23e
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/initialism.go
@@ -0,0 +1,75 @@
+// Code generated by initialismer; DO NOT EDIT.
+package canonicalheader
+
+// initialism mapping of not canonical headers from
+// https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
+// https://www.iana.org/assignments/http-fields/http-fields.xhtml.
+func initialism() map[string]string {
+ return map[string]string{
+ "A-Im": "A-IM",
+ "Accept-Ch": "Accept-CH",
+ "Alpn": "ALPN",
+ "Amp-Cache-Transform": "AMP-Cache-Transform",
+ "C-Pep": "C-PEP",
+ "C-Pep-Info": "C-PEP-Info",
+ "Cal-Managed-Id": "Cal-Managed-ID",
+ "Caldav-Timezones": "CalDAV-Timezones",
+ "Cdn-Cache-Control": "CDN-Cache-Control",
+ "Cdn-Loop": "CDN-Loop",
+ "Content-Id": "Content-ID",
+ "Content-Md5": "Content-MD5",
+ "Dasl": "DASL",
+ "Dav": "DAV",
+ "Differential-Id": "Differential-ID",
+ "Dnt": "DNT",
+ "Dpop": "DPoP",
+ "Dpop-Nonce": "DPoP-Nonce",
+ "Ediint-Features": "EDIINT-Features",
+ "Etag": "ETag",
+ "Expect-Ct": "Expect-CT",
+ "Getprofile": "GetProfile",
+ "Http2-Settings": "HTTP2-Settings",
+ "Im": "IM",
+ "Include-Referred-Token-Binding-Id": "Include-Referred-Token-Binding-ID",
+ "Last-Event-Id": "Last-Event-ID",
+ "Mime-Version": "MIME-Version",
+ "Nel": "NEL",
+ "Odata-Entityid": "OData-EntityId",
+ "Odata-Isolation": "OData-Isolation",
+ "Odata-Maxversion": "OData-MaxVersion",
+ "Odata-Version": "OData-Version",
+ "Optional-Www-Authenticate": "Optional-WWW-Authenticate",
+ "Oscore": "OSCORE",
+ "Oslc-Core-Version": "OSLC-Core-Version",
+ "P3p": "P3P",
+ "Pep": "PEP",
+ "Pep-Info": "PEP-Info",
+ "Pics-Label": "PICS-Label",
+ "Profileobject": "ProfileObject",
+ "Repeatability-Client-Id": "Repeatability-Client-ID",
+ "Repeatability-Request-Id": "Repeatability-Request-ID",
+ "Sec-Gpc": "Sec-GPC",
+ "Sec-Websocket-Accept": "Sec-WebSocket-Accept",
+ "Sec-Websocket-Extensions": "Sec-WebSocket-Extensions",
+ "Sec-Websocket-Key": "Sec-WebSocket-Key",
+ "Sec-Websocket-Protocol": "Sec-WebSocket-Protocol",
+ "Sec-Websocket-Version": "Sec-WebSocket-Version",
+ "Setprofile": "SetProfile",
+ "Slug": "SLUG",
+ "Soapaction": "SoapAction",
+ "Status-Uri": "Status-URI",
+ "Tcn": "TCN",
+ "Te": "TE",
+ "Ttl": "TTL",
+ "Uri": "URI",
+ "Www-Authenticate": "WWW-Authenticate",
+ "X-Correlation-Id": "X-Correlation-ID",
+ "X-Dns-Prefetch-Control": "X-DNS-Prefetch-Control",
+ "X-Real-Ip": "X-Real-IP",
+ "X-Request-Id": "X-Request-ID",
+ "X-Ua-Compatible": "X-UA-Compatible",
+ "X-Webkit-Csp": "X-WebKit-CSP",
+ "X-Xss": "X-XSS",
+ "X-Xss-Protection": "X-XSS-Protection",
+ }
+}
diff --git a/vendor/github.com/lasiar/canonicalheader/literal_string.go b/vendor/github.com/lasiar/canonicalheader/literal_string.go
new file mode 100644
index 000000000..71cd5f397
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/literal_string.go
@@ -0,0 +1,80 @@
+package canonicalheader
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strconv"
+ "unicode/utf8"
+ "unsafe"
+
+ "golang.org/x/tools/go/analysis"
+)
+
+type literalString struct {
+ originalValue string
+ quote byte
+ pos, end token.Pos
+}
+
+func newLiteralString(basicList *ast.BasicLit) (literalString, error) {
+ if basicList.Kind != token.STRING {
+ return literalString{}, fmt.Errorf("%#v is not a string", basicList)
+ }
+
+ if len(basicList.Value) < 2 {
+ return literalString{}, fmt.Errorf("%#v has a strange value length %q", basicList, basicList.Value)
+ }
+
+ quote := basicList.Value[0]
+ switch quote {
+ case '`', '"':
+ default:
+ return literalString{}, fmt.Errorf("%q is a strange quote", quote)
+ }
+
+ originalValue, err := strconv.Unquote(basicList.Value)
+ if err != nil {
+ return literalString{}, fmt.Errorf("unquote %q: %w", basicList.Value, err)
+ }
+
+ if !utf8.ValidString(originalValue) {
+ return literalString{}, fmt.Errorf("%#v is not a valid utf8 string", basicList.Value)
+ }
+
+ return literalString{
+ originalValue: originalValue,
+ quote: quote,
+ pos: basicList.Pos(),
+ end: basicList.End(),
+ }, nil
+}
+
+func (l literalString) diagnostic(canonicalHeader string) analysis.Diagnostic {
+ newText := make([]byte, 0, len(canonicalHeader)+2)
+ newText = append(newText, l.quote)
+ newText = append(newText, unsafe.Slice(unsafe.StringData(canonicalHeader), len(canonicalHeader))...)
+ newText = append(newText, l.quote)
+
+ return analysis.Diagnostic{
+ Pos: l.pos,
+ End: l.end,
+ Message: fmt.Sprintf("non-canonical header %q, instead use: %q", l.originalValue, canonicalHeader),
+ SuggestedFixes: []analysis.SuggestedFix{
+ {
+ Message: fmt.Sprintf("should replace %q with %q", l.originalValue, canonicalHeader),
+ TextEdits: []analysis.TextEdit{
+ {
+ Pos: l.pos,
+ End: l.end,
+ NewText: newText,
+ },
+ },
+ },
+ },
+ }
+}
+
+func (l literalString) value() string {
+ return l.originalValue
+}
diff --git a/vendor/github.com/lasiar/canonicalheader/makefile b/vendor/github.com/lasiar/canonicalheader/makefile
new file mode 100644
index 000000000..a96cb628e
--- /dev/null
+++ b/vendor/github.com/lasiar/canonicalheader/makefile
@@ -0,0 +1,12 @@
+.PHONY:
+
+test:
+ go test -v -race ./...
+
+linter:
+ golangci-lint -v run ./...
+
+generate:
+ go run ./cmd/initialismer/*.go -target="mapping" > ./initialism.go
+ go run ./cmd/initialismer/*.go -target="test" > ./testdata/src/initialism/initialism.go
+ gofmt -w ./initialism.go ./testdata/src/initialism/initialism.go