|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759 |
- // Copyright 2015 Google Inc. All rights reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package messageview
-
- import (
- "bufio"
- "bytes"
- "compress/flate"
- "compress/gzip"
- "io"
- "io/ioutil"
- "net/http"
- "strings"
- "testing"
-
- "github.com/google/martian/proxyutil"
- )
-
- func TestRequestViewHeadersOnly(t *testing.T) {
- body := strings.NewReader("body content")
- req, err := http.NewRequest("GET", "http://example.com/path?k=v", body)
- if err != nil {
- t.Fatalf("http.NewRequest(): got %v, want no error", err)
- }
- req.ContentLength = int64(body.Len())
- req.Header.Set("Request-Header", "true")
-
- mv := New()
- mv.SkipBody(true)
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "GET http://example.com/path?k=v HTTP/1.1\r\n" +
- "Host: example.com\r\n" +
- "Content-Length: 12\r\n" +
- "Request-Header: true\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- if _, err := br.Read(nil); err != io.EOF {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want io.EOF", err)
- }
-
- r, err := mv.Reader()
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
- }
-
- func TestRequestView(t *testing.T) {
- body := strings.NewReader("body content")
- req, err := http.NewRequest("GET", "http://example.com/path?k=v", body)
- if err != nil {
- t.Fatalf("http.NewRequest(): got %v, want no error", err)
- }
- req.Header.Set("Request-Header", "true")
-
- // Force Content Length to be unset to simulate lack of Content-Length and
- // Transfer-Encoding which is valid.
- req.ContentLength = -1
-
- mv := New()
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "GET http://example.com/path?k=v HTTP/1.1\r\n" +
- "Host: example.com\r\n" +
- "Request-Header: true\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "body content"
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- r, err := mv.Reader()
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
-
- // Sanity check to ensure it still parses.
- if _, err := http.ReadRequest(bufio.NewReader(bytes.NewReader(got))); err != nil {
- t.Fatalf("http.ReadRequest(): got %v, want no error", err)
- }
- }
-
- func TestRequestViewSkipBodyUnlessContentType(t *testing.T) {
- req, err := http.NewRequest("GET", "http://example.com", strings.NewReader("body content"))
- if err != nil {
- t.Fatalf("http.NewRequest(): got %v, want no error", err)
- }
- req.ContentLength = 12
- req.Header.Set("Content-Type", "text/plain; charset=utf-8")
-
- mv := New()
- mv.SkipBodyUnlessContentType("text/plain")
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "body content"
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- req.Header.Set("Content-Type", "image/png")
- mv = New()
- mv.SkipBodyUnlessContentType("text/plain")
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- br, err = mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- if _, err := br.Read(nil); err != io.EOF {
- t.Fatalf("br.Read(): got %v, want io.EOF", err)
- }
- }
-
- func TestRequestViewChunkedTransferEncoding(t *testing.T) {
- req, err := http.NewRequest("GET", "http://example.com/path?k=v", strings.NewReader("body content"))
- if err != nil {
- t.Fatalf("http.NewRequest(): got %v, want no error", err)
- }
- req.TransferEncoding = []string{"chunked"}
- req.Header.Set("Trailer", "Trailer-Header")
- req.Trailer = http.Header{
- "Trailer-Header": []string{"true"},
- }
-
- mv := New()
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "GET http://example.com/path?k=v HTTP/1.1\r\n" +
- "Host: example.com\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Trailer: Trailer-Header\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "c\r\nbody content\r\n0\r\n"
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- got, err = ioutil.ReadAll(mv.TrailerReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.TrailerReader()): got %v, want no error", err)
- }
-
- trailerwant := "Trailer-Header: true\r\n"
- if !bytes.Equal(got, []byte(trailerwant)) {
- t.Fatalf("mv.TrailerReader(): got %q, want %q", got, trailerwant)
- }
-
- r, err := mv.Reader()
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant + trailerwant); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
-
- // Sanity check to ensure it still parses.
- if _, err := http.ReadRequest(bufio.NewReader(bytes.NewReader(got))); err != nil {
- t.Fatalf("http.ReadRequest(): got %v, want no error", err)
- }
- }
-
- func TestRequestViewDecodeGzipContentEncoding(t *testing.T) {
- body := new(bytes.Buffer)
- gw := gzip.NewWriter(body)
- gw.Write([]byte("body content"))
- gw.Flush()
- gw.Close()
-
- req, err := http.NewRequest("GET", "http://example.com/path?k=v", body)
- if err != nil {
- t.Fatalf("http.NewRequest(): got %v, want no error", err)
- }
- req.TransferEncoding = []string{"chunked"}
- req.Header.Set("Content-Encoding", "gzip")
-
- mv := New()
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "GET http://example.com/path?k=v HTTP/1.1\r\n" +
- "Host: example.com\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Content-Encoding: gzip\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader(Decode())
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, wt o error", err)
- }
-
- bodywant := "body content"
-
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- r, err := mv.Reader(Decode())
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant + "\r\n"); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
- }
-
- func TestRequestViewDecodeDeflateContentEncoding(t *testing.T) {
- body := new(bytes.Buffer)
- dw, err := flate.NewWriter(body, -1)
- if err != nil {
- t.Fatalf("flate.NewWriter(): got %v, want no error", err)
- }
- dw.Write([]byte("body content"))
- dw.Flush()
- dw.Close()
-
- req, err := http.NewRequest("GET", "http://example.com/path?k=v", body)
- if err != nil {
- t.Fatalf("http.NewRequest(): got %v, want no error", err)
- }
- req.TransferEncoding = []string{"chunked"}
- req.Header.Set("Content-Encoding", "deflate")
-
- mv := New()
- if err := mv.SnapshotRequest(req); err != nil {
- t.Fatalf("SnapshotRequest(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "GET http://example.com/path?k=v HTTP/1.1\r\n" +
- "Host: example.com\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Content-Encoding: deflate\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader(Decode())
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "body content"
-
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- r, err := mv.Reader(Decode())
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant + "\r\n"); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
- }
-
- func TestResponseViewHeadersOnly(t *testing.T) {
- body := strings.NewReader("body content")
- res := proxyutil.NewResponse(200, body, nil)
- res.ContentLength = 12
- res.Header.Set("Response-Header", "true")
-
- mv := New()
- mv.SkipBody(true)
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "HTTP/1.1 200 OK\r\n" +
- "Content-Length: 12\r\n" +
- "Response-Header: true\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- if _, err := br.Read(nil); err != io.EOF {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want io.EOF", err)
- }
-
- r, err := mv.Reader()
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
- }
-
- func TestResponseView(t *testing.T) {
- body := strings.NewReader("body content")
- res := proxyutil.NewResponse(200, body, nil)
- res.ContentLength = 12
- res.Header.Set("Response-Header", "true")
-
- mv := New()
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "HTTP/1.1 200 OK\r\n" +
- "Content-Length: 12\r\n" +
- "Response-Header: true\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "body content"
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- r, err := mv.Reader()
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
-
- // Sanity check to ensure it still parses.
- if _, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(got)), nil); err != nil {
- t.Fatalf("http.ReadResponse(): got %v, want no error", err)
- }
- }
-
- func TestResponseViewSkipBodyUnlessContentType(t *testing.T) {
- res := proxyutil.NewResponse(200, strings.NewReader("body content"), nil)
- res.ContentLength = 12
- res.Header.Set("Content-Type", "text/plain; charset=utf-8")
-
- mv := New()
- mv.SkipBodyUnlessContentType("text/plain")
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "body content"
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- res.Header.Set("Content-Type", "image/png")
- mv = New()
- mv.SkipBodyUnlessContentType("text/plain")
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- br, err = mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- if _, err := br.Read(nil); err != io.EOF {
- t.Fatalf("br.Read(): got %v, want io.EOF", err)
- }
- }
-
- func TestResponseViewChunkedTransferEncoding(t *testing.T) {
- body := strings.NewReader("body content")
- res := proxyutil.NewResponse(200, body, nil)
- res.TransferEncoding = []string{"chunked"}
- res.Header.Set("Trailer", "Trailer-Header")
- res.Trailer = http.Header{
- "Trailer-Header": []string{"true"},
- }
-
- mv := New()
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "HTTP/1.1 200 OK\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Trailer: Trailer-Header\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader()
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, want no error", err)
- }
-
- bodywant := "c\r\nbody content\r\n0\r\n"
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- got, err = ioutil.ReadAll(mv.TrailerReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.TrailerReader()): got %v, want no error", err)
- }
-
- trailerwant := "Trailer-Header: true\r\n"
- if !bytes.Equal(got, []byte(trailerwant)) {
- t.Fatalf("mv.TrailerReader(): got %q, want %q", got, trailerwant)
- }
-
- r, err := mv.Reader()
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant + trailerwant); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
-
- // Sanity check to ensure it still parses.
- if _, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(got)), nil); err != nil {
- t.Fatalf("http.ReadResponse(): got %v, want no error", err)
- }
- }
-
- func TestResponseViewDecodeGzipContentEncoding(t *testing.T) {
- body := new(bytes.Buffer)
- gw := gzip.NewWriter(body)
- gw.Write([]byte("body content"))
- gw.Flush()
- gw.Close()
-
- res := proxyutil.NewResponse(200, body, nil)
- res.TransferEncoding = []string{"chunked"}
- res.Header.Set("Content-Encoding", "gzip")
-
- mv := New()
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "HTTP/1.1 200 OK\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Content-Encoding: gzip\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader(Decode())
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, wt o error", err)
- }
-
- bodywant := "body content"
-
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- r, err := mv.Reader(Decode())
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant + "\r\n"); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
- }
-
- func TestResponseViewDecodeGzipContentEncodingPartial(t *testing.T) {
- bodywant := "partial content"
- res := proxyutil.NewResponse(206, strings.NewReader(bodywant), nil)
- res.TransferEncoding = []string{"chunked"}
- res.Header.Set("Content-Encoding", "gzip")
-
- mv := New()
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
- br, err := mv.BodyReader(Decode())
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, wt o error", err)
- }
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
- }
-
- func TestResponseViewDecodeDeflateContentEncoding(t *testing.T) {
- body := new(bytes.Buffer)
- dw, err := flate.NewWriter(body, -1)
- if err != nil {
- t.Fatalf("flate.NewWriter(): got %v, want no error", err)
- }
- dw.Write([]byte("body content"))
- dw.Flush()
- dw.Close()
-
- res := proxyutil.NewResponse(200, body, nil)
- res.TransferEncoding = []string{"chunked"}
- res.Header.Set("Content-Encoding", "deflate")
-
- mv := New()
- if err := mv.SnapshotResponse(res); err != nil {
- t.Fatalf("SnapshotResponse(): got %v, want no error", err)
- }
-
- got, err := ioutil.ReadAll(mv.HeaderReader())
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.HeaderReader()): got %v, want no error", err)
- }
-
- hdrwant := "HTTP/1.1 200 OK\r\n" +
- "Transfer-Encoding: chunked\r\n" +
- "Content-Encoding: deflate\r\n\r\n"
-
- if !bytes.Equal(got, []byte(hdrwant)) {
- t.Fatalf("mv.HeaderReader(): got %q, want %q", got, hdrwant)
- }
-
- br, err := mv.BodyReader(Decode())
- if err != nil {
- t.Fatalf("mv.BodyReader(): got %v, want no error", err)
- }
-
- got, err = ioutil.ReadAll(br)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.BodyReader()): got %v, wt o error", err)
- }
-
- bodywant := "body content"
-
- if !bytes.Equal(got, []byte(bodywant)) {
- t.Fatalf("mv.BodyReader(): got %q, want %q", got, bodywant)
- }
-
- r, err := mv.Reader(Decode())
- if err != nil {
- t.Fatalf("mv.Reader(): got %v, want no error", err)
- }
- got, err = ioutil.ReadAll(r)
- if err != nil {
- t.Fatalf("ioutil.ReadAll(mv.Reader()): got %v, want no error", err)
- }
-
- if want := []byte(hdrwant + bodywant + "\r\n"); !bytes.Equal(got, want) {
- t.Fatalf("mv.Read(): got %q, want %q", got, want)
- }
- }
|