I had to write my own stub, which will disable the header range and encode the files
Maybe someone will be useful
import (
"compress/gzip"
"github.com/andybalholm/brotli"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
type compressResponseWriter struct {
w http.ResponseWriter
r *http.Request
compressor io.WriteCloser
initBrotli bool
isInitBrotli bool
}
func (rw *compressResponseWriter) Header() http.Header {
return rw.w.Header()
}
func (rw *compressResponseWriter) Write(d []byte) (int, error) {
if !rw.initBrotli {
rw.initCompressor()
}
if rw.isInitBrotli {
return rw.compressor.Write(d)
}
return rw.w.Write(d)
}
func (rw *compressResponseWriter) initCompressor() {
ct := rw.w.Header().Get("Content-Type")
rw.initBrotli = true
if ct == "" {
return
}
switch strings.Split(ct, ";")[0] {
case "text/javascript", "text/plain", "text/css", "text/html":
rw.w.Header().Del("Accept-Ranges")
rw.w.Header().Del("Content-Length")
rw.compressor = brotli.HTTPCompressor(rw.w, rw.r)
rw.isInitBrotli = true
default:
rw.isInitBrotli = false
}
}
func (rw *compressResponseWriter) WriteHeader(statusCode int) {
if statusCode == 200 {
if !rw.initBrotli {
rw.initCompressor()
}
} else {
rw.initBrotli = true
}
rw.w.WriteHeader(statusCode)
}
func (rw *compressResponseWriter) Close() {
if rw.isInitBrotli {
rw.compressor.Close()
}
}
func NewCompressResponseWriter(w http.ResponseWriter, r *http.Request) *compressResponseWriter {
r.Header.Del("Range")
return &compressResponseWriter{w: w, r: r, initBrotli: false}
}
func TestServeFile(t *testing.T) {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
c := NewCompressResponseWriter(w, r)
http.ServeFile(c, r, "./test.txt")
c.Close()
})
ts := httptest.NewServer(handler)
defer ts.Close()
req, _ := http.NewRequest(http.MethodGet, ts.URL, nil)
req.Header.Set("Accept-Encoding", "gzip, br")
req.Header.Set("Range", "bytes=0-9")
req.Header.Set("If-Modified-Since", "Sat, 06 Nov 2021 13:17:06 GMT")
res, err := http.DefaultClient.Do(req)
if err != nil {
t.Fatal(err)
}
defer res.Body.Close()
var reader io.Reader = res.Body
switch res.Header.Get("Content-Encoding") {
case "br":
reader = brotli.NewReader(res.Body)
case "gzip":
reader, err = gzip.NewReader(res.Body)
if err != nil {
t.Fatal(err.Error())
}
}
body, err := io.ReadAll(reader)
res.Body.Close()
if err != nil {
t.Fatal(err.Error())
}
t.Logf("len: %d == 101",len(body))
}