1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-30 01:52:26 +08:00

fix panic where closenotify was called from wrong goroutine

Previously, this was the result when running a test with go1.6rc2:

    go test github.com/ipfs/go-ipfs/commands/http
    panic: net/http: CloseNotify called after ServeHTTP finished

    goroutine 19 [running]:
    net/http.(*response).CloseNotify(0xc8202ca1a0, 0x0)
        /home/r/go/src/net/http/server.go:1533 +0x9d
    github.com/ipfs/go-ipfs/commands/http.internalHandler.ServeHTTP.func2(0x7f42c9d1d180, 0xc8202ca1a0, 0x7f42c9d66e90, 0xc8200f0380, 0xc8201d40d0)
        /home/r/src/github.com/ipfs/go-ipfs/commands/http/handler.go:143 +0x39
    created by github.com/ipfs/go-ipfs/commands/http.internalHandler.ServeHTTP
        /home/r/src/github.com/ipfs/go-ipfs/commands/http/handler.go:147 +0x49d
    FAIL	github.com/ipfs/go-ipfs/commands/http	0.013s

I had also encountered this panic when trying to use the webui.

License: MIT
Signed-off-by: Robert Carlsen <rwcarlsen@gmail.com>
This commit is contained in:
Robert Carlsen
2016-02-08 15:35:43 -06:00
parent 1aeec4a710
commit ed23d99d6f

View File

@ -138,9 +138,10 @@ func (i internalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithCancel(node.Context())
defer cancel()
if cn, ok := w.(http.CloseNotifier); ok {
clientGone := cn.CloseNotify()
go func() {
select {
case <-cn.CloseNotify():
case <-clientGone:
case <-ctx.Done():
}
cancel()