@@ -10,6 +10,7 @@ import (
1010 "io"
1111 "net/http"
1212 "net/http/httptest"
13+ "strconv"
1314 "strings"
1415 "sync"
1516 "testing"
@@ -31,18 +32,80 @@ func TestDecompress(t *testing.T) {
3132 gz , _ := gzipString (body )
3233 req := httptest .NewRequest (http .MethodPost , "/" , strings .NewReader (string (gz )))
3334 req .Header .Set (echo .HeaderContentEncoding , GZIPEncoding )
35+ req .Header .Set (echo .HeaderContentLength , strconv .Itoa (len (gz )))
36+ req .GetBody = func () (io.ReadCloser , error ) {
37+ return io .NopCloser (bytes .NewReader (gz )), nil
38+ }
3439 rec := httptest .NewRecorder ()
3540 c := e .NewContext (req , rec )
3641
3742 err := h (c )
3843 assert .NoError (t , err )
3944
40- assert .Equal (t , GZIPEncoding , req .Header .Get (echo .HeaderContentEncoding ))
45+ assert .Empty (t , req .Header .Get (echo .HeaderContentEncoding ))
46+ assert .Empty (t , req .Header .Get (echo .HeaderContentLength ))
47+ assert .Equal (t , int64 (- 1 ), req .ContentLength )
48+ assert .Nil (t , req .GetBody )
4149 b , err := io .ReadAll (req .Body )
4250 assert .NoError (t , err )
4351 assert .Equal (t , body , string (b ))
4452}
4553
54+ func TestDecompress_SkipsRepeatedContentEncodingValues (t * testing.T ) {
55+ e := echo .New ()
56+
57+ body := `{"name": "echo"}`
58+ gz , _ := gzipString (body )
59+ req := httptest .NewRequest (http .MethodPost , "/" , bytes .NewReader (gz ))
60+ req .Header .Add (echo .HeaderContentEncoding , GZIPEncoding )
61+ req .Header .Add (echo .HeaderContentEncoding , "br" )
62+ req .Header .Set (echo .HeaderContentLength , strconv .Itoa (len (gz )))
63+ req .GetBody = func () (io.ReadCloser , error ) {
64+ return io .NopCloser (bytes .NewReader (gz )), nil
65+ }
66+ rec := httptest .NewRecorder ()
67+ c := e .NewContext (req , rec )
68+
69+ var got []byte
70+ err := Decompress ()(func (c * echo.Context ) error {
71+ var readErr error
72+ got , readErr = io .ReadAll (c .Request ().Body )
73+ return readErr
74+ })(c )
75+
76+ assert .NoError (t , err )
77+ assert .Equal (t , gz , got )
78+ assert .Equal (t , []string {GZIPEncoding , "br" }, req .Header .Values (echo .HeaderContentEncoding ))
79+ assert .Equal (t , strconv .Itoa (len (gz )), req .Header .Get (echo .HeaderContentLength ))
80+ assert .Equal (t , int64 (len (gz )), req .ContentLength )
81+ assert .NotNil (t , req .GetBody )
82+ }
83+
84+ func TestDecompress_SkipsCommaSeparatedContentEncodingValues (t * testing.T ) {
85+ e := echo .New ()
86+
87+ body := `{"name": "echo"}`
88+ gz , _ := gzipString (body )
89+ req := httptest .NewRequest (http .MethodPost , "/" , bytes .NewReader (gz ))
90+ req .Header .Set (echo .HeaderContentEncoding , GZIPEncoding + ", br" )
91+ req .Header .Set (echo .HeaderContentLength , strconv .Itoa (len (gz )))
92+ rec := httptest .NewRecorder ()
93+ c := e .NewContext (req , rec )
94+
95+ var got []byte
96+ err := Decompress ()(func (c * echo.Context ) error {
97+ var readErr error
98+ got , readErr = io .ReadAll (c .Request ().Body )
99+ return readErr
100+ })(c )
101+
102+ assert .NoError (t , err )
103+ assert .Equal (t , gz , got )
104+ assert .Equal (t , GZIPEncoding + ", br" , req .Header .Get (echo .HeaderContentEncoding ))
105+ assert .Equal (t , strconv .Itoa (len (gz )), req .Header .Get (echo .HeaderContentLength ))
106+ assert .Equal (t , int64 (len (gz )), req .ContentLength )
107+ }
108+
46109func TestDecompress_skippedIfNoHeader (t * testing.T ) {
47110 e := echo .New ()
48111 req := httptest .NewRequest (http .MethodPost , "/" , strings .NewReader ("test" ))
@@ -99,7 +162,7 @@ func TestDecompressWithConfig_DefaultConfig(t *testing.T) {
99162 err := h (c )
100163 assert .NoError (t , err )
101164
102- assert .Equal ( t , GZIPEncoding , req .Header .Get (echo .HeaderContentEncoding ))
165+ assert .Empty ( t , req .Header .Get (echo .HeaderContentEncoding ))
103166 b , err := io .ReadAll (req .Body )
104167 assert .NoError (t , err )
105168 assert .Equal (t , body , string (b ))
@@ -215,8 +278,6 @@ func BenchmarkDecompress(b *testing.B) {
215278 e := echo .New ()
216279 body := `{"name": "echo"}`
217280 gz , _ := gzipString (body )
218- req := httptest .NewRequest (http .MethodPost , "/" , strings .NewReader (string (gz )))
219- req .Header .Set (echo .HeaderContentEncoding , GZIPEncoding )
220281
221282 h := Decompress ()(func (c * echo.Context ) error {
222283 c .Response ().Write ([]byte (body )) // For Content-Type sniffing
@@ -228,6 +289,8 @@ func BenchmarkDecompress(b *testing.B) {
228289
229290 for i := 0 ; i < b .N ; i ++ {
230291 // Decompress
292+ req := httptest .NewRequest (http .MethodPost , "/" , bytes .NewReader (gz ))
293+ req .Header .Set (echo .HeaderContentEncoding , GZIPEncoding )
231294 rec := httptest .NewRecorder ()
232295 c := e .NewContext (req , rec )
233296 h (c )
0 commit comments