go net/http/httputil: 导出 ReverseProxy.defaultErrorHandler

1l5u6lss  于 2个月前  发布在  Go
关注(0)|答案(1)|浏览(28)

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

$ go version
go version go1.11.1 darwin/amd64

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

是的。

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

go env 输出

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/harald/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/harald/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/Cellar/go/1.11.1/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.11.1/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
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 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/w3/11rv94110qnc2l400nlz7gmc0000gn/T/go-build136867624=/tmp/go-build -gno-record-gcc-switches -fno-common"

你期望看到什么?

在我看来,当使用ReverseProxy.ErrorHandler(来自 package httputil )时,一个很好的模式是在错误上进行自省,对某些类型的错误进行特殊处理或忽略,然后回退到默认的错误处理。
因此,我想导出这个函数,这样我就不必重新实现它(以及重新实现 logf ):

func (p *ReverseProxy) defaultErrorHandler(rw http.ResponseWriter, req *http.Request, err error) {
	p.logf("http: proxy error: %v", err)
	rw.WriteHeader(http.StatusBadGateway)
}

另一个好处是,随着Go版本的进步,你会收到对此逻辑的更新,而复制过来的代码会过时。

xn1cxnb4

xn1cxnb41#

我目前的解决方法是将该方法转换为一个函数,并将 ReverseProxy 作为第一个参数,以便在本地定义它:

// Adapted from https://github.com/golang/go/blob/go1.11.4/src/net/http/httputil/reverseproxy.go
func logf(p *httputil.ReverseProxy, format string, args ...interface{}) {
	if p.ErrorLog != nil {
		p.ErrorLog.Printf(format, args...)
	} else {
		log.Printf(format, args...)
	}
}

// Adapted from https://github.com/golang/go/blob/go1.11.4/src/net/http/httputil/reverseproxy.go
func defaultErrorHandler(p *httputil.ReverseProxy) func(rw http.ResponseWriter, req *http.Request, err error) {
	return func(rw http.ResponseWriter, req *http.Request, err error) {
		logf(p, "http: proxy error: %v", err)
		rw.WriteHeader(http.StatusBadGateway)
	}
}

相关问题