]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: check for CloseWrite interface, not TCPConn implementation
authorBrad Fitzpatrick <bradfitz@golang.org>
Thu, 25 Sep 2014 00:01:54 +0000 (17:01 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 25 Sep 2014 00:01:54 +0000 (17:01 -0700)
Fixes #8724

LGTM=adg
R=adg
CC=golang-codereviews
https://golang.org/cl/148040043

src/net/http/export_test.go
src/net/http/serve_test.go
src/net/http/server.go

index f8cc835b250180ba92526c83e2648dd7319635a5..e5bc02afa261dcd4d1d68e724786758d7a5cb54e 100644 (file)
@@ -77,3 +77,7 @@ var DefaultUserAgent = defaultUserAgent
 func SetPendingDialHooks(before, after func()) {
        prePendingDial, postPendingDial = before, after
 }
+
+var ExportServerNewConn = (*Server).newConn
+
+var ExportCloseWriteAndWait = (*conn).closeWriteAndWait
index ee4f2049953869150f9f200cdbf919336d34fb7e..a690ae46998be2169291cfd77b4ab0ba7419878f 100644 (file)
@@ -2607,6 +2607,29 @@ func TestServerConnStateNew(t *testing.T) {
        }
 }
 
+type closeWriteTestConn struct {
+       rwTestConn
+       didCloseWrite bool
+}
+
+func (c *closeWriteTestConn) CloseWrite() error {
+       c.didCloseWrite = true
+       return nil
+}
+
+func TestCloseWrite(t *testing.T) {
+       var srv Server
+       var testConn closeWriteTestConn
+       c, err := ExportServerNewConn(&srv, &testConn)
+       if err != nil {
+               t.Fatal(err)
+       }
+       ExportCloseWriteAndWait(c)
+       if !testConn.didCloseWrite {
+               t.Error("didn't see CloseWrite call")
+       }
+}
+
 func BenchmarkClientServer(b *testing.B) {
        b.ReportAllocs()
        b.StopTimer()
index 8f2b777b29eac67df8d7ecfda56ead753ee7c354..7ad0bcbc208d090d79f04b2b597dab285464690c 100644 (file)
@@ -1064,15 +1064,21 @@ func (c *conn) close() {
 // This timeout is somewhat arbitrary (~latency around the planet).
 const rstAvoidanceDelay = 500 * time.Millisecond
 
+type closeWriter interface {
+       CloseWrite() error
+}
+
+var _ closeWriter = (*net.TCPConn)(nil)
+
 // closeWrite flushes any outstanding data and sends a FIN packet (if
 // client is connected via TCP), signalling that we're done.  We then
-// pause for a bit, hoping the client processes it before `any
+// pause for a bit, hoping the client processes it before any
 // subsequent RST.
 //
 // See http://golang.org/issue/3595
 func (c *conn) closeWriteAndWait() {
        c.finalFlush()
-       if tcp, ok := c.rwc.(*net.TCPConn); ok {
+       if tcp, ok := c.rwc.(closeWriter); ok {
                tcp.CloseWrite()
        }
        time.Sleep(rstAvoidanceDelay)