From 9db22cf1af83757e7388a3c035f5c638b9fba22b Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Sun, 28 Jan 2024 13:56:33 -0500 Subject: internal/lume: start support for serving gzip streams directly Signed-off-by: Xe Iaso --- internal/lume/lume.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/internal/lume/lume.go b/internal/lume/lume.go index 47fd497..cded99d 100644 --- a/internal/lume/lume.go +++ b/internal/lume/lume.go @@ -11,6 +11,8 @@ import ( "io/fs" "log" "log/slog" + "net/http" + "net/http/httptest" "os" "os/exec" "path/filepath" @@ -279,6 +281,51 @@ func (f *FS) Update(ctx context.Context) error { return nil } +func (f *FS) crystallizeHeaders(destDir string) error { + fsys := os.DirFS(destDir) + h := http.FileServer(http.FS(fsys)) + + result := map[string]http.Header{} + + if err := fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error { + if err != nil { + return fmt.Errorf("lume: can't walk dir when crystallizing headers: %w", err) + } + + if d.IsDir() { + return nil + } + + req, err := http.NewRequest("GET", "http://localhost/"+path, nil) + if err != nil { + return fmt.Errorf("lume: can't create request when crystallizing headers: %w", err) + } + rw := httptest.NewRecorder() + + h.ServeHTTP(rw, req) + + resp := rw.Result() + + result[path] = resp.Header + + return nil + }); err != nil { + return err + } + + fout, err := os.Create(filepath.Join(destDir, ".xesite-headers.json")) + if err != nil { + return err + } + defer fout.Close() + + if err := json.NewEncoder(fout).Encode(result); err != nil { + return err + } + + return nil +} + func (f *FS) build(ctx context.Context, siteCommit string) error { builds.Add(1) destDir := filepath.Join(f.repoDir, f.opt.StaticSiteDir, "_site") @@ -308,6 +355,10 @@ func (f *FS) build(ctx context.Context, siteCommit string) error { lastBuildTime.Set(dur.Milliseconds()) slog.Info("built site", "dir", destDir, "time", dur.String()) + if err := f.crystallizeHeaders(destDir); err != nil { + return fmt.Errorf("lume: can't crystallize headers: %w", err) + } + zipLoc := filepath.Join(f.opt.DataDir, "site.zip") if err := ZipFolder(filepath.Join(cmd.Dir, "_site"), zipLoc); err != nil { -- cgit v1.2.3