mirror of
https://github.com/golang/go
synced 2024-11-18 10:24:42 -07:00
net/http: fix send on close channel error
Fixes #3793. Tested using GOMAXPROCS=81 which was able to trigger a panic in TestStressSurpriseServerCloses continually on a Core i5. R=fullung, bradfitz CC=golang-dev https://golang.org/cl/6445069
This commit is contained in:
parent
122a558f47
commit
2bdc60f8e7
@ -538,7 +538,6 @@ func remoteSideClosed(err error) bool {
|
||||
|
||||
func (pc *persistConn) readLoop() {
|
||||
defer close(pc.closech)
|
||||
defer close(pc.writech)
|
||||
alive := true
|
||||
var lastbody io.ReadCloser // last response body, if any, read on this connection
|
||||
|
||||
@ -640,19 +639,24 @@ func (pc *persistConn) readLoop() {
|
||||
}
|
||||
|
||||
func (pc *persistConn) writeLoop() {
|
||||
for wr := range pc.writech {
|
||||
if pc.isBroken() {
|
||||
wr.ch <- errors.New("http: can't write HTTP request on broken connection")
|
||||
continue
|
||||
for {
|
||||
select {
|
||||
case wr := <-pc.writech:
|
||||
if pc.isBroken() {
|
||||
wr.ch <- errors.New("http: can't write HTTP request on broken connection")
|
||||
continue
|
||||
}
|
||||
err := wr.req.Request.write(pc.bw, pc.isProxy, wr.req.extra)
|
||||
if err == nil {
|
||||
err = pc.bw.Flush()
|
||||
}
|
||||
if err != nil {
|
||||
pc.markBroken()
|
||||
}
|
||||
wr.ch <- err
|
||||
case <-pc.closech:
|
||||
return
|
||||
}
|
||||
err := wr.req.Request.write(pc.bw, pc.isProxy, wr.req.extra)
|
||||
if err == nil {
|
||||
err = pc.bw.Flush()
|
||||
}
|
||||
if err != nil {
|
||||
pc.markBroken()
|
||||
}
|
||||
wr.ch <- err
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user