【问题标题】:Go - runtime error: invalid memory address or nil pointer dereferenceGo - 运行时错误:无效的内存地址或 nil 指针取消引用
【发布时间】:2015-07-12 21:59:59
【问题描述】:

我正在尝试使用 Go 来创建一个代理服务器,它将请求正文中的某些值更改为 API,但是当发送请求时,会发生以下恐慌并且请求失败:

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

这是脚本:

func viewResponse(response *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
    log.Printf("Response: %s", response.Status)

    return response
}

【问题讨论】:

  • edit您的问题并缩短代码,以便仅包含重现问题所需的部分。
  • 我不知道是哪部分代码导致了问题,如果有人能告诉我是哪部分导致了问题,我会缩短代码
  • /home/bradley/turbocharger/proxy.go:40 是哪一行?请阅读堆栈跟踪,它会告诉您您需要知道的一切。

标签: http go proxy panic


【解决方案1】:

responsenil

来自文档:“如果出现错误,resp 将为 nil,并且 ctx.RoundTrip.Error 将包含错误。” https://github.com/elazarl/goproxy/blob/master/actions.go#L22-L28

所以实现响应处理程序的正确方法是这样的:

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
}

【讨论】:

  • 谢谢,这帮助我发现请求没有到达服务器,因为 request.ContentLength 与很容易修复的正文的实际长度不匹配
猜你喜欢
  • 2014-12-30
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2020-12-25
  • 2013-09-16
相关资源
最近更新 更多