Gzip the text responses
Nothing was compressed: the list page shipped ~123 KB of HTML, CSS and JS in the clear on every cold load, which is the wrong bill for a phone on mobile data. A stdlib middleware compresses the four content types this server actually serves in bulk and leaves woff2 alone, since it is already compressed. Measured on the live server: style.css 21.8 KB -> 6.5, htmx 50.9 -> 16.4, filter.js 7.6 -> 2.9. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"compress/gzip"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
@@ -196,3 +198,46 @@ func TestPutOmittedStatusPreservesArchivedAndAppliesProgress(t *testing.T) {
|
||||
t.Fatalf("stored last_chapter_num = %v, want 12", got.LastChapterNum)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGzipCompressesTextNotFonts(t *testing.T) {
|
||||
srv, _ := newWebTestServer(t, webConfig())
|
||||
|
||||
cases := []struct {
|
||||
path string
|
||||
want bool
|
||||
}{
|
||||
{"/static/style.css", true},
|
||||
{"/static/filter.js", true},
|
||||
{"/static/htmx.min.js", true},
|
||||
{"/static/fonts/dm-sans-var-latin.woff2", false},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
req := httptest.NewRequest(http.MethodGet, tc.path, nil)
|
||||
req.Header.Set("Accept-Encoding", "gzip")
|
||||
rr := httptest.NewRecorder()
|
||||
srv.ServeHTTP(rr, req)
|
||||
if rr.Code != http.StatusOK {
|
||||
t.Fatalf("GET %s = %d, want 200", tc.path, rr.Code)
|
||||
}
|
||||
got := rr.Header().Get("Content-Encoding") == "gzip"
|
||||
if got != tc.want {
|
||||
t.Errorf("GET %s Content-Encoding gzip = %v, want %v", tc.path, got, tc.want)
|
||||
}
|
||||
if got {
|
||||
zr, err := gzip.NewReader(rr.Body)
|
||||
if err != nil {
|
||||
t.Fatalf("GET %s: body is not gzip: %v", tc.path, err)
|
||||
}
|
||||
if _, err := io.ReadAll(zr); err != nil {
|
||||
t.Fatalf("GET %s: gzip body did not decode: %v", tc.path, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// A client that does not ask still gets plain bytes.
|
||||
rr := httptest.NewRecorder()
|
||||
srv.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/static/style.css", nil))
|
||||
if enc := rr.Header().Get("Content-Encoding"); enc != "" {
|
||||
t.Errorf("Content-Encoding without Accept-Encoding = %q, want empty", enc)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user