type testConn struct {
        readBuf  bytes.Buffer
        writeBuf bytes.Buffer
+       closec   chan bool // if non-nil, send value to it on close
 }
 
 func (c *testConn) Read(b []byte) (int, error) {
 }
 
 func (c *testConn) Close() error {
+       select {
+       case c.closec <- true:
+       default:
+       }
        return nil
 }
 
                        "Content-Length: %d\r\n"+
                        "\r\n", len(body))))
        conn.readBuf.Write([]byte(body))
-
-       done := make(chan bool)
+       conn.closec = make(chan bool, 1)
 
        ls := &oneConnListener{conn}
        go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-               defer close(done)
                if conn.readBuf.Len() < len(body)/2 {
                        t.Errorf("on request, read buffer length is %d; expected about 1MB", conn.readBuf.Len())
                }
                        t.Errorf("post-WriteHeader, read buffer length is %d; expected about 1MB", conn.readBuf.Len())
                }
        }))
-       <-done
+       <-conn.closec
 
        if res := conn.writeBuf.String(); !strings.Contains(res, "Connection: close") {
                t.Errorf("Expected a Connection: close header; got response: %s", res)
 func TestServerBufferedChunking(t *testing.T) {
        conn := new(testConn)
        conn.readBuf.Write([]byte("GET / HTTP/1.1\r\n\r\n"))
-       done := make(chan bool)
+       conn.closec = make(chan bool, 1)
        ls := &oneConnListener{conn}
        go Serve(ls, HandlerFunc(func(rw ResponseWriter, req *Request) {
-               defer close(done)
                rw.(Flusher).Flush() // force the Header to be sent, in chunking mode, not counting the length
                rw.Write([]byte{'x'})
                rw.Write([]byte{'y'})
                rw.Write([]byte{'z'})
        }))
-       <-done
+       <-conn.closec
        if !bytes.HasSuffix(conn.writeBuf.Bytes(), []byte("\r\n\r\n3\r\nxyz\r\n0\r\n\r\n")) {
                t.Errorf("response didn't end with a single 3 byte 'xyz' chunk; got:\n%q",
                        conn.writeBuf.Bytes())