]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/net/http/responsecontroller_test.go
net/http: support full-duplex HTTP/1 responses
[gostls13.git] / src / net / http / responsecontroller_test.go
index 0dca7332b796704c90d5e935f46efa3d9a8abe79..ee8b55a89ff25cde08485e693da888cb9a0290f6 100644 (file)
@@ -263,3 +263,51 @@ func testWrappedResponseController(t *testing.T, mode testMode) {
        io.Copy(io.Discard, res.Body)
        defer res.Body.Close()
 }
+
+func TestResponseControllerEnableFullDuplex(t *testing.T) {
+       run(t, testResponseControllerEnableFullDuplex)
+}
+func testResponseControllerEnableFullDuplex(t *testing.T, mode testMode) {
+       cst := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, req *Request) {
+               ctl := NewResponseController(w)
+               if err := ctl.EnableFullDuplex(); err != nil {
+                       // TODO: Drop test for HTTP/2 when x/net is updated to support
+                       // EnableFullDuplex. Since HTTP/2 supports full duplex by default,
+                       // the rest of the test is fine; it's just the EnableFullDuplex call
+                       // that fails.
+                       if mode != http2Mode {
+                               t.Errorf("ctl.EnableFullDuplex() = %v, want nil", err)
+                       }
+               }
+               w.WriteHeader(200)
+               ctl.Flush()
+               for {
+                       var buf [1]byte
+                       n, err := req.Body.Read(buf[:])
+                       if n != 1 || err != nil {
+                               break
+                       }
+                       w.Write(buf[:])
+                       ctl.Flush()
+               }
+       }))
+       pr, pw := io.Pipe()
+       res, err := cst.c.Post(cst.ts.URL, "text/apocryphal", pr)
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer res.Body.Close()
+       for i := byte(0); i < 10; i++ {
+               if _, err := pw.Write([]byte{i}); err != nil {
+                       t.Fatalf("Write: %v", err)
+               }
+               var buf [1]byte
+               if n, err := res.Body.Read(buf[:]); n != 1 || err != nil {
+                       t.Fatalf("Read: %v, %v", n, err)
+               }
+               if buf[0] != i {
+                       t.Fatalf("read byte %v, want %v", buf[0], i)
+               }
+       }
+       pw.Close()
+}