diff --git a/server/ctrl/static.go b/server/ctrl/static.go index 04cef7af..615da23b 100644 --- a/server/ctrl/static.go +++ b/server/ctrl/static.go @@ -21,7 +21,6 @@ import ( . "github.com/mickael-kerjean/filestash/server/common" "github.com/bluekeyes/go-gitdiff/gitdiff" - "github.com/google/brotli/go/cbrotli" ) var ( @@ -404,10 +403,11 @@ var preload = [][]string{ func ServeBundle() func(*App, http.ResponseWriter, *http.Request) { isDebug := os.Getenv("DEBUG") == "true" - buildChunks := func(quality int) (chunks [][]byte, chunksBr [][]byte, etags []string) { + buildChunks := func(quality int) (chunks [][]byte, chunksBr [][]byte, chunksGzip [][]byte, etags []string) { numChunks := len(preload) chunks = make([][]byte, numChunks+1) chunksBr = make([][]byte, numChunks+1) + chunksGzip = make([][]byte, numChunks+1) etags = make([]string, numChunks+1) var fullBuf bytes.Buffer for i := 0; i < numChunks; i++ { @@ -438,24 +438,26 @@ func ServeBundle() func(*App, http.ResponseWriter, *http.Request) { fullBuf.WriteString(line) } chunks[i+1] = chunkBuf.Bytes() - chunksBr[i+1], _ = cbrotli.Encode(chunks[i+1], cbrotli.WriterOptions{Quality: quality}) + chunksGzip[i+1] = compressGzip(chunks[i+1], quality) + chunksBr[i+1] = compressBr(chunks[i+1], quality) etags[i+1] = QuickHash(string(chunks[i+1]), 10) } chunks[0] = fullBuf.Bytes() - chunksBr[0], _ = cbrotli.Encode(chunks[0], cbrotli.WriterOptions{Quality: quality}) + chunksGzip[0] = compressGzip(chunks[0], quality) + chunksBr[0] = compressBr(chunks[0], quality) etags[0] = QuickHash(string(chunks[0]), 10) - return chunks, chunksBr, etags + return chunks, chunksBr, chunksGzip, etags } quality := 11 if isDebug { quality = 8 } - chunks, chunksBr, etags := buildChunks(quality) + chunks, chunksBr, chunksGzip, etags := buildChunks(quality) return func(ctx *App, res http.ResponseWriter, req *http.Request) { if isDebug { - chunks, chunksBr, etags = buildChunks(quality) + chunks, chunksBr, chunksGzip, etags = buildChunks(quality) } chunkIndex := 0 if parsed, err := strconv.Atoi(req.URL.Query().Get("chunk")); err == nil { @@ -476,6 +478,10 @@ func ServeBundle() func(*App, http.ResponseWriter, *http.Request) { head.Set("Content-Encoding", "br") res.Write(chunksBr[chunkIndex]) return + } else if strings.Contains(req.Header.Get("Accept-Encoding"), "gzip") && len(chunksGzip[chunkIndex]) > 0 { + head.Set("Content-Encoding", "gzip") + res.Write(chunksGzip[chunkIndex]) + return } res.Write(chunks[chunkIndex]) } diff --git a/server/ctrl/static_withcgo.go b/server/ctrl/static_withcgo.go new file mode 100644 index 00000000..303fcf8c --- /dev/null +++ b/server/ctrl/static_withcgo.go @@ -0,0 +1,17 @@ +//go:build !static +// +build !static + +package ctrl + +import ( + "github.com/google/brotli/go/cbrotli" +) + +func compressGzip(content []byte, quality int) []byte { + return []byte{} +} + +func compressBr(content []byte, quality int) []byte { + out, _ := cbrotli.Encode(content, cbrotli.WriterOptions{Quality: quality}) + return out +} diff --git a/server/ctrl/static_withoutcgo.go b/server/ctrl/static_withoutcgo.go new file mode 100644 index 00000000..45de2420 --- /dev/null +++ b/server/ctrl/static_withoutcgo.go @@ -0,0 +1,24 @@ +//go:build static +// +build static + +package ctrl + +import ( + "bytes" + "compress/gzip" +) + +func compressGzip(content []byte, quality int) []byte { + var buf bytes.Buffer + gz, err := gzip.NewWriterLevel(&buf, quality) + if err != nil { + gz = gzip.NewWriter(&buf) + } + _, _ = gz.Write(content) + gz.Close() + return buf.Bytes() +} + +func compressBr(content []byte, quality int) []byte { + return []byte("") +}