aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoni Sawicki <tenox@google.com>2022-11-29 02:06:05 -0800
committerAntoni Sawicki <tenox@google.com>2022-11-29 02:06:05 -0800
commit1435cee856fc17c50a5733faaa4eafa339f56d8f (patch)
treef13859dcf36090cbb25cad43c5bc52be02b6dc9f
parent6c7159448134a0aac9d9c3f253af43e2b63593d9 (diff)
downloadwfm-1435cee856fc17c50a5733faaa4eafa339f56d8f.tar.gz
aferoize archiver fs
-rw-r--r--fileio.go5
-rw-r--r--formats.go32
2 files changed, 29 insertions, 8 deletions
diff --git a/fileio.go b/fileio.go
index c5ee15c..ab7ac72 100644
--- a/fileio.go
+++ b/fileio.go
@@ -43,9 +43,8 @@ func (r *wfmRequest) dispFile() {
listZip(r.w, fp, r.fs)
case ".7z":
list7z(r.w, fp, r.fs)
- // currently doesnt work with afero fs
- // case "tar", "rar", "gz", "bz2", "xz", "tgz", "tbz2", "txz":
- //listArchive(r.w, fp)
+ case ".tar", ".rar", ".gz", ".bz2", ".xz", ".tgz", ".tbz2", ".txz":
+ listArchive(r.w, fp, r.fs)
case ".iso":
listIso(r.w, fp, r.fs)
diff --git a/formats.go b/formats.go
index 647839b..c414674 100644
--- a/formats.go
+++ b/formats.go
@@ -3,6 +3,7 @@ package main
import (
"archive/zip"
"fmt"
+ "io"
"io/fs"
"log"
"net/http"
@@ -152,14 +153,34 @@ func list7z(w http.ResponseWriter, fp string, wfs afero.Fs) {
}
}
-// TODO(tenox): aferoize
-func listArchive(w http.ResponseWriter, fp string) {
- return // doesnt work with afero
- a, err := archiver.FileSystem(fp)
+func listArchive(w http.ResponseWriter, fp string, wfs afero.Fs) {
+ f, err := wfs.Open(fp)
+ if err != nil {
+ htErr(w, "archive: open: ", err)
+ return
+ }
+
+ defer f.Close()
+ s, err := f.Stat()
+ if err != nil {
+ htErr(w, "archive: stat: ", err)
+ return
+ }
+
+ af, _, err := archiver.Identify(f.Name(), f)
if err != nil {
- htErr(w, "archiver", err)
+ htErr(w, "archive: identify: ", err)
return
}
+
+ aa := &archiver.ArchiveFS{Stream: io.NewSectionReader(f, 0, s.Size()), Format: af.(archiver.Archival)}
+
+ a, err := aa.Sub(".")
+ if err != nil {
+ htErr(w, "archive: FS: ", err)
+ return
+ }
+
w.Header().Set("Content-Type", "text/plain")
w.Header().Set("Cache-Control", *cacheCtl)
@@ -176,6 +197,7 @@ func listArchive(w http.ResponseWriter, fp string) {
}
}
+// TODO(tenox): finish implementing
// TODO(tenox): aferoize
func du() {
rf, err := os.Stat("/")