add compression

This commit is contained in:
Josh Grebe 2025-07-11 08:49:29 -05:00
parent fe53085bba
commit c7b59a5c9e
3 changed files with 70 additions and 6 deletions

6
go.mod
View File

@ -1,8 +1,10 @@
module git.teamworkapps.com/shortcut/httphere
go 1.17
go 1.24.1
require (
git.teamworkapps.com/shortcut/enhancedfileserver v0.0.0-20230421162957-948ff8787756
github.com/gorilla/mux v1.8.0
github.com/gorilla/mux v1.8.1
)
require github.com/andybalholm/brotli v1.2.0 // indirect

8
go.sum
View File

@ -1,6 +1,6 @@
git.teamworkapps.com/shortcut/enhancedfileserver v0.0.0-20181107163431-49cae39a0eb7 h1:wl0faTtewN9Y0nTZpRY2mcaIhVkaR1l8k920U0rDIk0=
git.teamworkapps.com/shortcut/enhancedfileserver v0.0.0-20181107163431-49cae39a0eb7/go.mod h1:4t5y+BFcMRTe6GkAX72YXcjrKbGkOVM7CkJMRHNZYiQ=
git.teamworkapps.com/shortcut/enhancedfileserver v0.0.0-20230421162957-948ff8787756 h1:ViHTT1GI1JlsLrUsivl4tvg6DySn35d1C3bzXeLa8uY=
git.teamworkapps.com/shortcut/enhancedfileserver v0.0.0-20230421162957-948ff8787756/go.mod h1:Px7gD0CL+z9WBsvFPtCuDpVEJNStJXrbFRD3q7aJwYk=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=

62
main.go
View File

@ -1,12 +1,16 @@
package main
import (
"compress/gzip"
"flag"
"fmt"
"io"
"log"
"net/http"
"strings"
"git.teamworkapps.com/shortcut/enhancedfileserver"
"github.com/andybalholm/brotli"
"github.com/gorilla/mux"
)
@ -51,6 +55,9 @@ func main() {
r.Use(noCache)
}
// Always enable compression (both brotli and gzip)
r.Use(compression)
if c.noindex {
r.PathPrefix("/").Handler(http.StripPrefix("/", enhancedfileserver.FileServerNoIndex(http.Dir("./"))))
} else {
@ -92,3 +99,58 @@ func queryLog(next http.Handler) http.Handler {
next.ServeHTTP(w, r)
})
}
// compressionWriter wraps http.ResponseWriter to provide compression
type compressionWriter struct {
http.ResponseWriter
writer io.Writer
}
func (cw *compressionWriter) Write(b []byte) (int, error) {
return cw.writer.Write(b)
}
// compression middleware that supports both brotli and gzip
func compression(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Get the Accept-Encoding header
acceptEncoding := r.Header.Get("Accept-Encoding")
// Check if client supports brotli (preferred)
if strings.Contains(acceptEncoding, "br") {
w.Header().Set("Content-Encoding", "br")
w.Header().Set("Vary", "Accept-Encoding")
bw := brotli.NewWriter(w)
defer bw.Close()
cw := &compressionWriter{
ResponseWriter: w,
writer: bw,
}
next.ServeHTTP(cw, r)
return
}
// Check if client supports gzip
if strings.Contains(acceptEncoding, "gzip") {
w.Header().Set("Content-Encoding", "gzip")
w.Header().Set("Vary", "Accept-Encoding")
gw := gzip.NewWriter(w)
defer gw.Close()
cw := &compressionWriter{
ResponseWriter: w,
writer: gw,
}
next.ServeHTTP(cw, r)
return
}
// No compression supported, serve normally
next.ServeHTTP(w, r)
})
}