]> Sergey Matveev's repositories - sgblog.git/blobdiff - cmd/sgblog/http.go
No reason to use gzip, when zstd exists
[sgblog.git] / cmd / sgblog / http.go
index 027dd43998014097cf3f6eac4d9ed8b8abcb1c32..9c39c44dab7f6ae2103ba2cca995ff5868e31d66 100644 (file)
@@ -17,7 +17,6 @@ package main
 
 import (
        "bytes"
-       "compress/gzip"
        "crypto/sha1"
        _ "embed"
        "encoding/hex"
@@ -39,6 +38,7 @@ import (
        "github.com/go-git/go-git/v5"
        "github.com/go-git/go-git/v5/plumbing"
        "github.com/go-git/go-git/v5/plumbing/object"
+       "github.com/klauspost/compress/zstd"
        "github.com/vorlif/spreak"
        "go.stargrave.org/sgblog"
        "go.stargrave.org/sgblog/cmd/sgblog/atom"
@@ -126,13 +126,13 @@ func lineURLizeInTemplate(urlPrefix, line interface{}) string {
        return lineURLize(urlPrefix.(string), line.(string))
 }
 
-func startHeader(etag hash.Hash, gziped bool) string {
+func startHeader(etag hash.Hash, zstded bool) string {
        lines := []string{
                "Content-Type: text/html; charset=utf-8",
                "ETag: " + etagString(etag),
        }
-       if gziped {
-               lines = append(lines, "Content-Encoding: gzip")
+       if zstded {
+               lines = append(lines, "Content-Encoding: zstd")
        }
        lines = append(lines, "")
        lines = append(lines, "")
@@ -242,12 +242,15 @@ func serveHTTP() {
        var outBuf bytes.Buffer
        var out io.Writer
        out = &outBuf
-       var gzipWriter *gzip.Writer
+       var zstdWriter *zstd.Encoder
        acceptEncoding := os.Getenv("HTTP_ACCEPT_ENCODING")
        for _, encoding := range strings.Split(acceptEncoding, ", ") {
-               if encoding == "gzip" {
-                       gzipWriter = gzip.NewWriter(&outBuf)
-                       out = gzipWriter
+               if encoding == "zstd" {
+                       zstdWriter, err = zstd.NewWriter(&outBuf, zstd.WithEncoderLevel(zstd.SpeedDefault))
+                       if err != nil {
+                               panic(err)
+                       }
+                       out = zstdWriter
                }
        }
 
@@ -344,7 +347,7 @@ func serveHTTP() {
                if offsetPrev < 0 {
                        offsetPrev = 0
                }
-               os.Stdout.Write([]byte(startHeader(etagHash, gzipWriter != nil)))
+               os.Stdout.Write([]byte(startHeader(etagHash, zstdWriter != nil)))
                err = TmplHTMLIndex.Execute(out, struct {
                        T                *spreak.Localizer
                        Version          string
@@ -404,9 +407,9 @@ func serveHTTP() {
                }
                os.Stdout.WriteString("Content-Type: text/plain; charset=utf-8\n")
                os.Stdout.WriteString("ETag: " + etagString(etagHash) + "\n")
-               if gzipWriter != nil {
-                       os.Stdout.WriteString("Content-Encoding: gzip\n")
-                       gzipWriter.Close()
+               if zstdWriter != nil {
+                       os.Stdout.WriteString("Content-Encoding: zstd\n")
+                       zstdWriter.Close()
                }
                os.Stdout.WriteString("\n")
                os.Stdout.Write(outBuf.Bytes())
@@ -736,7 +739,7 @@ func serveHTTP() {
                        notesLines = strings.Split(string(notesRaw), "\n")
                }
 
-               os.Stdout.Write([]byte(startHeader(etagHash, gzipWriter != nil)))
+               os.Stdout.Write([]byte(startHeader(etagHash, zstdWriter != nil)))
                err = TmplHTMLEntry.Execute(out, struct {
                        T               *spreak.Localizer
                        Version         string
@@ -775,8 +778,8 @@ func serveHTTP() {
                makeErr(errors.New("unknown URL action"), http.StatusNotFound)
        }
        out.Write([]byte("</body></html>\n"))
-       if gzipWriter != nil {
-               gzipWriter.Close()
+       if zstdWriter != nil {
+               zstdWriter.Close()
        }
        os.Stdout.Write(outBuf.Bytes())
        return
@@ -784,9 +787,9 @@ func serveHTTP() {
 AtomFinish:
        os.Stdout.WriteString("Content-Type: application/atom+xml; charset=utf-8\n")
        os.Stdout.WriteString("ETag: " + etagString(etagHash) + "\n")
-       if gzipWriter != nil {
-               os.Stdout.WriteString("Content-Encoding: gzip\n")
-               gzipWriter.Close()
+       if zstdWriter != nil {
+               os.Stdout.WriteString("Content-Encoding: zstd\n")
+               zstdWriter.Close()
        }
        os.Stdout.WriteString("\n")
        os.Stdout.Write(outBuf.Bytes())