1
0
mirror of https://github.com/golang/go synced 2024-11-18 08:14:41 -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:
Dave Cheney 2012-08-21 11:18:16 +10:00
parent 122a558f47
commit 2bdc60f8e7

View File

@ -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
}
}