aboutsummaryrefslogtreecommitdiff
path: root/internal/lume
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-10-27 10:28:05 -0400
committerXe Iaso <me@xeiaso.net>2023-10-27 10:28:12 -0400
commit88ce81cc191cda29c1f7f0d9cf1f16a0873f6fe1 (patch)
tree6aa94e0e20820ef7965a46396ba4c9e326130926 /internal/lume
parent930708194b6f1aff52c30f336f70db4b33d38f83 (diff)
downloadxesite-88ce81cc191cda29c1f7f0d9cf1f16a0873f6fe1.tar.xz
xesite-88ce81cc191cda29c1f7f0d9cf1f16a0873f6fe1.zip
internal/lume: start work on dynamically replacing the zip filesystem for XeDN serving
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'internal/lume')
-rw-r--r--internal/lume/zip.go52
1 files changed, 51 insertions, 1 deletions
diff --git a/internal/lume/zip.go b/internal/lume/zip.go
index cecfb38..90513fc 100644
--- a/internal/lume/zip.go
+++ b/internal/lume/zip.go
@@ -10,9 +10,14 @@ import (
"os"
"path/filepath"
"strings"
+ "sync"
+
+ "xeiaso.net/v4/internal"
)
-const compressionGZIP = 0x69
+const (
+ compressionGZIP = 0x69
+)
func init() {
zip.RegisterCompressor(compressionGZIP, func(w io.Writer) (io.WriteCloser, error) {
@@ -163,3 +168,48 @@ func isCompressible(fname string) (bool, error) {
// The file is compressible by both its header and name
return true, nil
}
+
+type ZipServer struct {
+ lock sync.RWMutex
+ zip *zip.ReadCloser
+}
+
+func NewZipServer(zipPath string) (*ZipServer, error) {
+ file, err := zip.OpenReader(zipPath)
+ if err != nil {
+ return nil, err
+ }
+
+ result := &ZipServer{
+ zip: file,
+ }
+
+ return result, nil
+}
+
+func (zs *ZipServer) Update(fname string) error {
+ zs.lock.Lock()
+ defer zs.lock.Unlock()
+
+ old := zs.zip
+
+ file, err := zip.OpenReader(fname)
+ if err != nil {
+ return err
+ }
+
+ zs.zip = file
+
+ old.Close()
+ return nil
+}
+
+func (zs *ZipServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ zs.lock.RLock()
+ defer zs.lock.RUnlock()
+
+ vals := internal.ParseValueAndParams(r.Header.Get("Accept-Encoding"))
+ slog.Info("accept-encoding", "vals", vals)
+
+ http.FileServer(http.FS(zs.zip)).ServeHTTP(w, r)
+}