diff --git a/pkg/analyzer/analyzer.go b/pkg/analyzer/analyzer.go index 3bc808e..dce7952 100644 --- a/pkg/analyzer/analyzer.go +++ b/pkg/analyzer/analyzer.go @@ -205,20 +205,25 @@ func run(pass *analysis.Pass) (interface{}, error) { return } - if selectorExpr.Sel.Name != "StatusCode" { - return - } - basicLit, ok := binaryExpr.Y.(*ast.BasicLit) if !ok { return } - if !lookupFlag(pass, HTTPStatusCodeFlag) { - return - } + switch selectorExpr.Sel.Name { + case "StatusCode": + if !lookupFlag(pass, HTTPStatusCodeFlag) { + return + } + + checkHTTPStatusCode(pass, basicLit) + case "Method": + if !lookupFlag(pass, HTTPMethodFlag) { + return + } - checkHTTPStatusCode(pass, basicLit) + checkHTTPMethod(pass, basicLit) + } } }) diff --git a/pkg/analyzer/internal/template/test-httpmethod.go.tmpl b/pkg/analyzer/internal/template/test-httpmethod.go.tmpl index d039f38..9f5695c 100644 --- a/pkg/analyzer/internal/template/test-httpmethod.go.tmpl +++ b/pkg/analyzer/internal/template/test-httpmethod.go.tmpl @@ -35,3 +35,31 @@ func _() { } {{- end }} } + +{{ range $key, $value := .Mapping }} +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "{{ $key }}" { // want `"{{ quoteMeta $key }}" can be replaced by {{ quoteMeta $value }}` + return nil + } + return nil +} +{{ end -}} + +{{ range $key, $value := .Mapping }} +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == {{ $value }} { + return nil + } + return nil +} +{{ end -}} diff --git a/pkg/analyzer/testdata/src/a/http/method.go b/pkg/analyzer/testdata/src/a/http/method.go index 4579cab..a432f04 100755 --- a/pkg/analyzer/testdata/src/a/http/method.go +++ b/pkg/analyzer/testdata/src/a/http/method.go @@ -81,3 +81,219 @@ func _() { Method: "TRACE", // want `"TRACE" can be replaced by http\.MethodTrace` } } + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "CONNECT" { // want `"CONNECT" can be replaced by http\.MethodConnect` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "DELETE" { // want `"DELETE" can be replaced by http\.MethodDelete` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "GET" { // want `"GET" can be replaced by http\.MethodGet` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "HEAD" { // want `"HEAD" can be replaced by http\.MethodHead` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "OPTIONS" { // want `"OPTIONS" can be replaced by http\.MethodOptions` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "PATCH" { // want `"PATCH" can be replaced by http\.MethodPatch` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "POST" { // want `"POST" can be replaced by http\.MethodPost` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "PUT" { // want `"PUT" can be replaced by http\.MethodPut` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == "TRACE" { // want `"TRACE" can be replaced by http\.MethodTrace` + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodConnect { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodDelete { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodGet { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodHead { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodOptions { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodPatch { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodPost { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodPut { + return nil + } + return nil +} + +func _() error { + resp, err := http.DefaultClient.Do(&http.Request{}) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.Request.Method == http.MethodTrace { + return nil + } + return nil +}