执行-运行时错误:无效的内存地址或nil指针取消引用
问题描述:
I am trying to use Go to make a proxy server which changes certain values in the body of a request to an API however when the request is sent the following panic occurs and the request fails:
2015/05/03 14:17:52 http: panic serving 192.168.1.139:42818: runtime error: invalid memory address or nil pointer dereference
goroutine 72 [running]:
net/http.func·011()
/usr/lib/go/src/pkg/net/http/server.go:1100 +0xb1
runtime.panic(0x8258ee0, 0x83b3733)
/usr/lib/go/src/pkg/runtime/panic.c:248 +0x176
main.viewResponse(0x0, 0x1861b470, 0x1860ed01)
/home/bradley/turbocharger/proxy.go:40 +0xa2
github.com/elazarl/goproxy.FuncRespHandler.Handle(0x82e6480, 0x0, 0x1861b470, 0x1)
/home/bradley/gopath/src/github.com/elazarl/goproxy/actions.go:35 +0x39
github.com/elazarl/goproxy.func·016(0x0, 0x1861b470, 0x827a768)
/home/bradley/gopath/src/github.com/elazarl/goproxy/dispatcher.go:279 +0x18f
github.com/elazarl/goproxy.FuncRespHandler.Handle(0x1868c9b0, 0x0, 0x1861b470, 0x4)
/home/bradley/gopath/src/github.com/elazarl/goproxy/actions.go:35 +0x39
github.com/elazarl/goproxy.(*ProxyHttpServer).filterResponse(0x18682640, 0x0, 0x1861b470, 0x0)
/home/bradley/gopath/src/github.com/elazarl/goproxy/proxy.go:69 +0x95
github.com/elazarl/goproxy.(*ProxyHttpServer).ServeHTTP(0x18682640, 0xb74dd780, 0x18601260, 0x18600bd0)
/home/bradley/gopath/src/github.com/elazarl/goproxy/proxy.go:115 +0x39b
net/http.serverHandler.ServeHTTP(0x18681dc0, 0xb74dd780, 0x18601260, 0x18600bd0)
/usr/lib/go/src/pkg/net/http/server.go:1673 +0x155
net/http.(*conn).serve(0x18628a00)
/usr/lib/go/src/pkg/net/http/server.go:1174 +0x8c6
created by net/http.(*Server).Serve
/usr/lib/go/src/pkg/net/http/server.go:1721 +0x2be
Here is the script:
func viewResponse(response *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
log.Printf("Response: %s", response.Status)
return response
}
我正在尝试使用Go制作代理服务器,该代理服务器会更改对API的请求正文中的某些值 但是,发送请求时,会发生以下紧急情况,并且请求失败: p>
2015/05/03 14:17:52 http:紧急服务192.168.1.139:42818:运行时 错误:无效的内存地址或nil指针取消引用
goroutine 72 [正在运行]:
net / http.func·011()
/usr/lib/go/src/pkg/net/http/server.go:1100 + 0xb1
runtime.panic(0x8258ee0,0x83b3733)
/usr/lib/go/src/pkg/runtime/panic.c:248 + 0x176
main.viewResponse(0x0,0x1861b470,0x1860ed01)
/ home / bradley / turbocharger /proxy.go:40 + 0xa2
github.com/elazarl/goproxy.FuncRespHandler.Handle(0x82e6480,0x0,0x1861b470,0x1)
/home/bradley/gopath/src/github.com/elazarl/goproxy/actions。 转到:35 + 0x39
github.com/elazarl/goproxy.func·016(0x0,0x1861b470,0x827a768)
/home/bradley/gopath/src/github.com/elazarl/goproxy/dispatcher.go:279 + 0x18f
github.com/elaz arl / goproxy.FuncRespHandler.Handle(0x1868c9b0、0x0、0x1861b470、0x4)
/home/bradley/gopath/src/github.com/elazarl/goproxy/actions.go:35 + 0x39
github.com/elazarl/goproxy 。(* ProxyHttpServer).filterResponse(0x18682640、0x0、0x1861b470、0x0)
/home/bradley/gopath/src/github.com/elazarl/goproxy/proxy.go:69 + 0x95
github.com/elazarl/goproxy 。(* ProxyHttpServer).ServeHTTP(0x18682640、0xb74dd780、0x18601260、0x18600bd0)
/home/bradley/gopath/src/github.com/elazarl/goproxy/proxy.go:115 + 0x39b
net / http.serverHandler.ServeHTTP (0x18681dc0、0xb74dd780、0x18601260、0x18600bd0)
/usr/lib/go/src/pkg/net/http/server.go:1673 + 0x155
net / http。(* conn).serve(0x18628a00)
/ usr / lib / go / src / pkg / net / http / server.go:1174 + 0x8c6
由net / http创建。(* Server).Serve
/ usr / lib / go / src / pkg / net / http /server.go:1721 + 0x2be
code> pre>
以下是脚本: p>
func viewResponse(response * http .Response,ctx * goproxy.ProxyCtx)* http.Response {
log.Printf(“ Response:%s”,resp onse.Status)
返回响应
}
code> pre>
div>
答
response
is nil
.
From the doc: "In case of error, resp will be nil, and ctx.RoundTrip.Error will contain the error." https://github.com/elazarl/goproxy/blob/master/actions.go#L22-L28
So the correct way to implement your response handler is something like this:
func viewResponse(response *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
if response == nil {
log.Printf("Error: %s", ctx.RoundTrip.Error)
} else {
log.Printf("Response: %s", response.Status)
}
return response
}