]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: fix send on close channel error
authorDave Cheney <dave@cheney.net>
Tue, 21 Aug 2012 01:18:16 +0000 (11:18 +1000)
committerDave Cheney <dave@cheney.net>
Tue, 21 Aug 2012 01:18:16 +0000 (11:18 +1000)
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

src/pkg/net/http/transport.go

index 00509acd447ab06644879c5368ddeca2966734cf..fe6318824e0b13ae54e7d878b0f9e5b526ceb46b 100644 (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
-               }
-               err := wr.req.Request.write(pc.bw, pc.isProxy, wr.req.extra)
-               if err == nil {
-                       err = pc.bw.Flush()
-               }
-               if err != nil {
-                       pc.markBroken()
+       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
                }
-               wr.ch <- err
        }
 }