http2: write Transport bodies

Some polish and testing remains, but this should be the bulk of the
Transport work that was remaining.

There's one notable (but easy) TODO about sending WINDOW_UPDATE frames
every few hundred MB or so, but this is a checkpoint.

Updates golang/go#6891

Change-Id: Iced9850804bf2c069c75118895ee7c3750ba31b5
Reviewed-on: https://go-review.googlesource.com/16310
Reviewed-by: Blake Mizerany <blake.mizerany@gmail.com>
diff --git a/http2/transport_test.go b/http2/transport_test.go
index 7b62aa9..7bed140 100644
--- a/http2/transport_test.go
+++ b/http2/transport_test.go
@@ -165,3 +165,42 @@
 		t.Fatal("timeout")
 	}
 }
+
+func TestTransportBody(t *testing.T) {
+	gotc := make(chan interface{}, 1)
+	st := newServerTester(t,
+		func(w http.ResponseWriter, r *http.Request) {
+			slurp, err := ioutil.ReadAll(r.Body)
+			if err != nil {
+				gotc <- err
+			} else {
+				gotc <- string(slurp)
+
+			}
+		},
+		optOnlyServer,
+	)
+	defer st.Close()
+
+	tr := &Transport{
+		InsecureTLSDial: true,
+	}
+	defer tr.CloseIdleConnections()
+	const body = "Some message"
+	req, err := http.NewRequest("POST", st.ts.URL, strings.NewReader(body))
+	if err != nil {
+		t.Fatal(err)
+	}
+	c := &http.Client{Transport: tr}
+	res, err := c.Do(req)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer res.Body.Close()
+	got := <-gotc
+	if err, ok := got.(error); ok {
+		t.Fatal(err)
+	} else if got.(string) != body {
+		t.Errorf("Read body = %q; want %q", got, body)
+	}
+}