aboutsummaryrefslogtreecommitdiff
path: root/server_test.go
diff options
context:
space:
mode:
authorGravatar AutumnSun <qsy1314@mail.ustc.edu.cn> 2023-07-02 18:40:26 +0800
committerGravatar GitHub <noreply@github.com> 2023-07-02 12:40:26 +0200
commit0d0bbfee5a8dd12a82e442d3cbb11e56726dd06e (patch)
tree9cf86b8ad5e5709c3907eda99d5919acafc242e1 /server_test.go
parentRemove unnecessary indent blocks (#1586) (diff)
downloadfasthttp-0d0bbfee5a8dd12a82e442d3cbb11e56726dd06e.tar.gz
fasthttp-0d0bbfee5a8dd12a82e442d3cbb11e56726dd06e.tar.bz2
fasthttp-0d0bbfee5a8dd12a82e442d3cbb11e56726dd06e.zip
Auto add 'Vary' header after compression (#1585)
* Auto add 'Vary' header after compression Add config `SetAddVaryHeaderForCompression` to enable 'Vary: Accept-Encoding' header when compression is used. * feat: always set the Vary header * create and use `ResponseHeader.AddVaryBytes` * not export 'AddVaryBytes'
Diffstat (limited to 'server_test.go')
-rw-r--r--server_test.go141
1 files changed, 141 insertions, 0 deletions
diff --git a/server_test.go b/server_test.go
index e22da4e..67ca8a6 100644
--- a/server_test.go
+++ b/server_test.go
@@ -2035,6 +2035,147 @@ func TestCompressHandler(t *testing.T) {
}
}
+func TestCompressHandlerVary(t *testing.T) {
+ t.Parallel()
+
+ expectedBody := string(createFixedBody(2e4))
+
+ h := CompressHandlerBrotliLevel(func(ctx *RequestCtx) {
+ ctx.WriteString(expectedBody) //nolint:errcheck
+ }, CompressBrotliBestSpeed, CompressBestSpeed)
+
+ var ctx RequestCtx
+ var resp Response
+
+ // verify uncompressed response
+ h(&ctx)
+ s := ctx.Response.String()
+ br := bufio.NewReader(bytes.NewBufferString(s))
+ if err := resp.Read(br); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ ce := resp.Header.ContentEncoding()
+ if string(ce) != "" {
+ t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "")
+ }
+ vary := resp.Header.Peek("Vary")
+ if string(vary) != "" {
+ t.Fatalf("unexpected Vary: %q. Expecting %q", vary, "")
+ }
+ body := resp.Body()
+ if string(body) != expectedBody {
+ t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
+ }
+
+ // verify gzip-compressed response
+ ctx.Request.Reset()
+ ctx.Response.Reset()
+ ctx.Request.Header.Set("Accept-Encoding", "gzip, deflate, sdhc")
+
+ h(&ctx)
+ s = ctx.Response.String()
+ br = bufio.NewReader(bytes.NewBufferString(s))
+ if err := resp.Read(br); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ ce = resp.Header.ContentEncoding()
+ if string(ce) != "gzip" {
+ t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "gzip")
+ }
+ vary = resp.Header.Peek("Vary")
+ if string(vary) != "Accept-Encoding" {
+ t.Fatalf("unexpected Vary: %q. Expecting %q", vary, "Accept-Encoding")
+ }
+ body, err := resp.BodyGunzip()
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if string(body) != expectedBody {
+ t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
+ }
+
+ // an attempt to compress already compressed response
+ ctx.Request.Reset()
+ ctx.Response.Reset()
+ ctx.Request.Header.Set("Accept-Encoding", "gzip, deflate, sdhc")
+ hh := CompressHandler(h)
+ hh(&ctx)
+ s = ctx.Response.String()
+ br = bufio.NewReader(bytes.NewBufferString(s))
+ if err := resp.Read(br); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ ce = resp.Header.ContentEncoding()
+ if string(ce) != "gzip" {
+ t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "gzip")
+ }
+ vary = resp.Header.Peek("Vary")
+ if string(vary) != "Accept-Encoding" {
+ t.Fatalf("unexpected Vary: %q. Expecting %q", vary, "Accept-Encoding")
+ }
+ body, err = resp.BodyGunzip()
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if string(body) != expectedBody {
+ t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
+ }
+
+ // verify deflate-compressed response
+ ctx.Request.Reset()
+ ctx.Response.Reset()
+ ctx.Request.Header.Set(HeaderAcceptEncoding, "foobar, deflate, sdhc")
+
+ h(&ctx)
+ s = ctx.Response.String()
+ br = bufio.NewReader(bytes.NewBufferString(s))
+ if err := resp.Read(br); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ ce = resp.Header.ContentEncoding()
+ if string(ce) != "deflate" {
+ t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "deflate")
+ }
+ vary = resp.Header.Peek("Vary")
+ if string(vary) != "Accept-Encoding" {
+ t.Fatalf("unexpected Vary: %q. Expecting %q", vary, "Accept-Encoding")
+ }
+ body, err = resp.BodyInflate()
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if string(body) != expectedBody {
+ t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
+ }
+
+ // verify br-compressed response
+ ctx.Request.Reset()
+ ctx.Response.Reset()
+ ctx.Request.Header.Set(HeaderAcceptEncoding, "gzip, deflate, br")
+
+ h(&ctx)
+ s = ctx.Response.String()
+ br = bufio.NewReader(bytes.NewBufferString(s))
+ if err := resp.Read(br); err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ ce = resp.Header.ContentEncoding()
+ if string(ce) != "br" {
+ t.Fatalf("unexpected Content-Encoding: %q. Expecting %q", ce, "br")
+ }
+ vary = resp.Header.Peek("Vary")
+ if string(vary) != "Accept-Encoding" {
+ t.Fatalf("unexpected Vary: %q. Expecting %q", vary, "Accept-Encoding")
+ }
+ body, err = resp.BodyUnbrotli()
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if string(body) != expectedBody {
+ t.Fatalf("unexpected body %q. Expecting %q", body, expectedBody)
+ }
+}
+
func TestRequestCtxWriteString(t *testing.T) {
t.Parallel()