go `cmd/vet:检查在body已经被写入后,http.ResponseWriter的WriteHeader调用,`

t98cgbkg  于 6个月前  发布在  Go
关注(0)|答案(3)|浏览(49)

你正在使用哪个版本的Go( go version )?

$ go version
go version go1.11 linux/amd64

这个问题在最新版本中是否会重现?

是的。

你正在使用什么操作系统和处理器架构( go env )?

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/adam/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/adam/code"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build369596792=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

考虑以下代码:

package main

import (
        "encoding/json"
        "fmt"
        "net/http"
)

func main() {
        http.HandleFunc("/ping", func (w http.ResponseWriter, r *http.Request) {
                type response struct {
                        Error error `json:"error"`
                }
                if err := json.NewEncoder(w).Encode(response{nil}); err != nil {
                        fmt.Println(err)
                }
                w.Header().Set("Content-Type", "application/json; charset=utf-8")
        })

        go http.ListenAndServe(":6060", nil)

        resp, err := http.Get("http://localhost:6060")
        if err != nil {
                panic(err)
        }
        fmt.Println(resp.Header.Get("Content-Type"))
}

这段代码输出:

$ go run /tmp/vet/main.go
text/plain; charset=utf-8

评论

让vet意识到这个常见的错误并能够提醒开发者一个简单的解决方法是很不错的。 http.ResponseWriter 的文档描述了所有的细节,但通常会被忽略。

xlpyo6sf

xlpyo6sf1#

@adamdecaf 这个新的验证逻辑需要忽略设置拖车的情况吗?

nc1teljy

nc1teljy2#

/cc @alandonovan@josharian@mvdan per owners .
Also /cc @dominikh in case this is one of the checks you've considered previously for staticcheck.

vsaztqbk

vsaztqbk3#

我迅速使用空值检查器的方法进行了原型设计,寻找一个由将w转换为io.Writer的调用主导的w.Header().Set()。你可以通过识别在它仍然是一个ResponseWriter时可能写入w的其他函数来进一步进行。
我已经附上了在标准库中找到的日志--所有的测试,不出所料。
'
responsewriter.txt
顺便说一下:我希望你只为这个例子写了go http.ListenAndServe(":6060", nil),因为它会丢弃错误结果。;)

相关问题