aboutsummaryrefslogtreecommitdiff
path: root/internal/lume/lume.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/lume/lume.go')
-rw-r--r--internal/lume/lume.go51
1 files changed, 51 insertions, 0 deletions
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 {