From: Brad Fitzpatrick Date: Tue, 31 Jul 2018 21:05:26 +0000 (+0000) Subject: net/http: add test showing that ReverseProxy HTTP/2 bidi streaming works X-Git-Tag: go1.12beta1~1389 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d58f3e6fea4e4540ad54caf9e141fe213c87d710;p=gostls13.git net/http: add test showing that ReverseProxy HTTP/2 bidi streaming works Change-Id: I8361ae33c785e45e3ccc7e9bc2732c887eeb41c4 Reviewed-on: https://go-review.googlesource.com/127015 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Matt Layher Reviewed-by: Brad Fitzpatrick --- diff --git a/src/net/http/clientserver_test.go b/src/net/http/clientserver_test.go index c2a2548df1..9a05b648e3 100644 --- a/src/net/http/clientserver_test.go +++ b/src/net/http/clientserver_test.go @@ -9,8 +9,11 @@ package http_test import ( "bytes" "compress/gzip" + "crypto/rand" + "crypto/sha1" "crypto/tls" "fmt" + "hash" "io" "io/ioutil" "log" @@ -1479,3 +1482,67 @@ func testWriteHeaderAfterWrite(t *testing.T, h2, hijack bool) { t.Errorf("stderr output = %q; want %q", gotLog, wantLog) } } + +func TestBidiStreamReverseProxy(t *testing.T) { + setParallel(t) + defer afterTest(t) + backend := newClientServerTest(t, h2Mode, HandlerFunc(func(w ResponseWriter, r *Request) { + if _, err := io.Copy(w, r.Body); err != nil { + log.Printf("bidi backend copy: %v", err) + } + })) + defer backend.close() + + backURL, err := url.Parse(backend.ts.URL) + if err != nil { + t.Fatal(err) + } + rp := httputil.NewSingleHostReverseProxy(backURL) + rp.Transport = backend.tr + proxy := newClientServerTest(t, h2Mode, HandlerFunc(func(w ResponseWriter, r *Request) { + rp.ServeHTTP(w, r) + })) + defer proxy.close() + + bodyRes := make(chan interface{}, 1) // error or hash.Hash + pr, pw := io.Pipe() + req, _ := NewRequest("PUT", proxy.ts.URL, pr) + const size = 4 << 20 + go func() { + h := sha1.New() + _, err := io.CopyN(io.MultiWriter(h, pw), rand.Reader, size) + go pw.Close() + if err != nil { + bodyRes <- err + } else { + bodyRes <- h + } + }() + res, err := backend.c.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + hgot := sha1.New() + n, err := io.Copy(hgot, res.Body) + if err != nil { + t.Fatal(err) + } + if n != size { + t.Fatalf("got %d bytes; want %d", n, size) + } + select { + case v := <-bodyRes: + switch v := v.(type) { + default: + t.Fatalf("body copy: %v", err) + case hash.Hash: + if !bytes.Equal(v.Sum(nil), hgot.Sum(nil)) { + t.Errorf("written bytes didn't match received bytes") + } + } + case <-time.After(10 * time.Second): + t.Fatal("timeout") + } + +}