Files
Loki/internal/loki/web_gzip_test.go
T
MichaelandClaude Opus 5.5 f75f3cf27d Web : réponses compressées en gzip
Repris d'AJEAN 0.15.7 (web_gzip.go et son test, tels quels).

L'UI (~590 Ko de HTML/JS/CSS en un seul fichier) et les gros JSON
(historique relu, liste des sessions, journal) partaient en clair. gzip
les divise par 4 à 8 — ça se sent sur un téléphone en Wi-Fi ou à travers
le tunnel.

La décision se prend au premier octet, sur le Content-Type posé par le
handler : les flux SSE (chat, complétions /v1 en streaming) et les
binaires passent tels quels — un flux compressé retiendrait ses
événements dans le tampon de gzip. Flush reste transmis pour les réponses
progressives, et Unwrap laisse le WebSocket des postes distants atteindre
le Hijacker d'origine.

Seul l'écouteur local est enveloppé : le tunnel sert le mux nu, comme
avant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 23:05:34 +02:00

53 lines
1.5 KiB
Go

package loki
import (
"compress/gzip"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
// JSON compressé, flux SSE et binaires laissés tels quels.
func TestGzipHandler(t *testing.T) {
h := gzipHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
case "/json":
sendJSON(w, 200, map[string]any{"x": strings.Repeat("a", 5000)})
case "/sse":
w.Header().Set("Content-Type", "text/event-stream")
w.Write([]byte("data: 1\n\n"))
w.(http.Flusher).Flush()
case "/bin":
w.Header().Set("Content-Type", "application/octet-stream")
w.Write([]byte{1, 2, 3})
}
}))
get := func(p string) *httptest.ResponseRecorder {
r := httptest.NewRequest("GET", p, nil)
r.Header.Set("Accept-Encoding", "gzip, deflate")
rec := httptest.NewRecorder()
h.ServeHTTP(rec, r)
return rec
}
j := get("/json")
if j.Header().Get("Content-Encoding") != "gzip" {
t.Fatal("JSON non compressé")
}
zr, err := gzip.NewReader(j.Body)
if err != nil {
t.Fatal(err)
}
b, _ := io.ReadAll(zr)
if !strings.Contains(string(b), strings.Repeat("a", 5000)) || j.Body.Len() > 500 {
t.Fatalf("décompression/ratio inattendus (%d o compressés)", j.Body.Len())
}
if s := get("/sse"); s.Header().Get("Content-Encoding") != "" || s.Body.String() != "data: 1\n\n" || !s.Flushed {
t.Fatal("le flux SSE ne doit pas être compressé et doit rester vidable")
}
if b := get("/bin"); b.Header().Get("Content-Encoding") != "" {
t.Fatal("binaire compressé à tort")
}
}