Browse Source
reverseproxy: Close websocket conn if req context cancels
This is a recent patch in the Go standard library
master
Matthew Holt
5 years ago
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
1 changed files with
14 additions and
1 deletions
-
modules/caddyhttp/reverseproxy/streaming.go
|
|
@ -49,7 +49,20 @@ func (h Handler) handleUpgradeResponse(rw http.ResponseWriter, req *http.Request |
|
|
|
// p.getErrorHandler()(rw, req, fmt.Errorf("internal error: 101 switching protocols response with non-writable body"))
|
|
|
|
return |
|
|
|
} |
|
|
|
defer backConn.Close() |
|
|
|
|
|
|
|
// adopted from https://github.com/golang/go/commit/8bcf2834afdf6a1f7937390903a41518715ef6f5
|
|
|
|
backConnCloseCh := make(chan struct{}) |
|
|
|
go func() { |
|
|
|
// Ensure that the cancelation of a request closes the backend.
|
|
|
|
// See issue https://golang.org/issue/35559.
|
|
|
|
select { |
|
|
|
case <-req.Context().Done(): |
|
|
|
case <-backConnCloseCh: |
|
|
|
} |
|
|
|
backConn.Close() |
|
|
|
}() |
|
|
|
defer close(backConnCloseCh) |
|
|
|
|
|
|
|
conn, brw, err := hj.Hijack() |
|
|
|
if err != nil { |
|
|
|
// p.getErrorHandler()(rw, req, fmt.Errorf("Hijack failed on protocol switch: %v", err))
|
|
|
|