http2: add tests to verify the type of peer stream resets

Make sure that both the server and client can see typed errors when
the peer's body is interrupted by a stream reset. grpc will need this.

Turns out things were okay, but the behavior wasn't locked in. Now it is.

Change-Id: I449a52e368efe9a3d44c59cc9a4fc15365bc4f12
Reviewed-on: https://go-review.googlesource.com/18502
Reviewed-by: Andrew Gerrand <adg@golang.org>
diff --git a/http2/transport_test.go b/http2/transport_test.go
index 597f0a2..7183ccb 100644
--- a/http2/transport_test.go
+++ b/http2/transport_test.go
@@ -1232,3 +1232,34 @@
 	ct.run()
 
 }
+
+// Test that the the Transport returns a typed error from Response.Body.Read calls
+// when the server sends an error. (here we use a panic, since that should generate
+// a stream error, but others like cancel should be similar)
+func TestTransportBodyReadErrorType(t *testing.T) {
+	st := newServerTester(t,
+		func(w http.ResponseWriter, r *http.Request) {
+			w.(http.Flusher).Flush() // force headers out
+			panic("boom")
+		},
+		optOnlyServer,
+		optQuiet,
+	)
+	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)
+	}
+	defer res.Body.Close()
+	buf := make([]byte, 100)
+	n, err := res.Body.Read(buf)
+	want := StreamError{StreamID: 0x1, Code: 0x2}
+	if !reflect.DeepEqual(want, err) {
+		t.Errorf("Read = %v, %#v; want error %#v", n, err, want)
+	}
+}