|
@@ -2915,3 +2915,58 @@ func TestAuthorityAddr(t *testing.T) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+// Issue 20448: stop allocating for DATA frames' payload after
|
|
|
|
|
+// Response.Body.Close is called.
|
|
|
|
|
+func TestTransportAllocationsAfterResponseBodyClose(t *testing.T) {
|
|
|
|
|
+ megabyteZero := make([]byte, 1<<20)
|
|
|
|
|
+
|
|
|
|
|
+ writeErr := make(chan error, 1)
|
|
|
|
|
+
|
|
|
|
|
+ st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
+ w.(http.Flusher).Flush()
|
|
|
|
|
+ var sum int64
|
|
|
|
|
+ for i := 0; i < 100; i++ {
|
|
|
|
|
+ n, err := w.Write(megabyteZero)
|
|
|
|
|
+ sum += int64(n)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ writeErr <- err
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ t.Logf("wrote all %d bytes", sum)
|
|
|
|
|
+ writeErr <- nil
|
|
|
|
|
+ }, optOnlyServer)
|
|
|
|
|
+ defer st.Close()
|
|
|
|
|
+
|
|
|
|
|
+ tr := &Transport{TLSClientConfig: tlsConfigInsecure}
|
|
|
|
|
+ defer tr.CloseIdleConnections()
|
|
|
|
|
+ c := &http.Client{Transport: tr}
|
|
|
|
|
+ res, err := c.Get(st.ts.URL)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ var buf [1]byte
|
|
|
|
|
+ if _, err := res.Body.Read(buf[:]); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ if err := res.Body.Close(); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ trb, ok := res.Body.(transportResponseBody)
|
|
|
|
|
+ if !ok {
|
|
|
|
|
+ t.Fatalf("res.Body = %T; want transportResponseBody", res.Body)
|
|
|
|
|
+ }
|
|
|
|
|
+ if trb.cs.bufPipe.b != nil {
|
|
|
|
|
+ // TODO(tombergan,bradfitz): turn this into an error:
|
|
|
|
|
+ t.Logf("response body pipe is still open")
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ gotErr := <-writeErr
|
|
|
|
|
+ if gotErr == nil {
|
|
|
|
|
+ t.Errorf("Handler unexpectedly managed to write its entire response without getting an error")
|
|
|
|
|
+ } else if gotErr != errStreamClosed {
|
|
|
|
|
+ t.Errorf("Handler Write err = %v; want errStreamClosed", gotErr)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|