diff options
author | Antoni Sawicki <tenox@google.com> | 2022-11-29 02:06:05 -0800 |
---|---|---|
committer | Antoni Sawicki <tenox@google.com> | 2022-11-29 02:06:05 -0800 |
commit | 1435cee856fc17c50a5733faaa4eafa339f56d8f (patch) | |
tree | f13859dcf36090cbb25cad43c5bc52be02b6dc9f | |
parent | 6c7159448134a0aac9d9c3f253af43e2b63593d9 (diff) | |
download | wfm-1435cee856fc17c50a5733faaa4eafa339f56d8f.tar.gz |
aferoize archiver fs
-rw-r--r-- | fileio.go | 5 | ||||
-rw-r--r-- | formats.go | 32 |
2 files changed, 29 insertions, 8 deletions
@@ -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) @@ -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("/") |