1
package encode
2
3
import (
4
+ "context"
5
+ "io"
6
"net/http"
7
+ "net/http/httptest"
8
"slices"
9
"sync"
10
"testing"
11
+
12
+ "github.com/caddyserver/caddy/v2"
13
+ "github.com/caddyserver/caddy/v2/modules/caddyhttp"
14
)
15
16
func BenchmarkOpenResponseWriter(b *testing.B) {
301
})
302
}
303
}
304
+
305
+type mockEncoder struct{}
306
+
307
+func (mockEncoder) Write(p []byte) (n int, err error) { return len(p), nil }
308
+func (mockEncoder) Close() error { return nil }
309
+func (mockEncoder) Reset(w io.Writer) {}
310
+func (mockEncoder) Flush() error { return nil }
311
+
312
+func TestServeHTTPDefaultEncodingPreference(t *testing.T) {
313
+ enc := new(Encode)
314
+ enc.MinLength = 1 // compress everything
315
+ enc.writerPools = map[string]*sync.Pool{
316
+ "gzip": {
317
+ New: func() any { return mockEncoder{} },
318
+ },
319
+ "zstd": {
320
+ New: func() any { return mockEncoder{} },
321
+ },
322
+ }
323
+
324
+ // Call Provision() with a valid caddy.Context to exercise the real path
325
+ ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()})
326
+ defer cancel()
327
+ if err := enc.Provision(ctx); err != nil {
328
+ t.Fatalf("Provision failed: %v", err)
329
+ }
330
+
331
+ // Test default preference: zstd preferred over gzip
332
+ r, err := http.NewRequest("GET", "/", nil)
333
+ if err != nil {
334
+ t.Fatalf("error creating request: %v", err)
335
+ }
336
+ r.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd")
337
+
338
+ w := httptest.NewRecorder()
339
+ w.Header().Set("Content-Type", "text/plain")
340
+
341
+ next := caddyhttp.HandlerFunc(func(w http.ResponseWriter, r *http.Request) error {
342
+ w.WriteHeader(http.StatusOK)
343
+ _, err := w.Write([]byte("Hello, world! This is a long enough string to satisfy min length if it wasn't 1."))
344
+ return err
345
+ })
346
+
347
+ err = enc.ServeHTTP(w, r, next)
348
+ if err != nil {
349
+ t.Fatalf("ServeHTTP returned error: %v", err)
350
+ }
351
+
352
+ // ETag suffix or Content-Encoding header should reflect zstd
353
+ contentEncoding := w.Header().Get("Content-Encoding")
354
+ if contentEncoding != "zstd" {
355
+ t.Errorf("Expected Content-Encoding to be 'zstd' by default, got '%s'", contentEncoding)
356
+ }
357
+
358
+ // Test explicit user preference: gzip over zstd
359
+ enc.Prefer = []string{"gzip", "zstd"}
360
+
361
+ w2 := httptest.NewRecorder()
362
+ w2.Header().Set("Content-Type", "text/plain")
363
+ err = enc.ServeHTTP(w2, r, next)
364
+ if err != nil {
365
+ t.Fatalf("ServeHTTP returned error: %v", err)
366
+ }
367
+
368
+ contentEncoding2 := w2.Header().Get("Content-Encoding")
369
+ if contentEncoding2 != "gzip" {
370
+ t.Errorf("Expected Content-Encoding to be 'gzip' when explicitly preferred, got '%s'", contentEncoding2)
371
+ }
372
+}