dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 8531d14089c96b1c60326fcc331d8e75f214061e
parent fd73a1d66de5f3d8b8951137c12cd301d9d7324c
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed, 25 Jan 2023 23:36:21 -0800

efficient filedrop stream downloader

Diffstat:
Mpkg/database/tableFiledrops.go | 13++++---------
Mpkg/web/handlers/handlers.go | 17++++++++++++-----
2 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/pkg/database/tableFiledrops.go b/pkg/database/tableFiledrops.go @@ -2,9 +2,9 @@ package database import ( "dkforest/pkg/utils" + ucrypto "dkforest/pkg/utils/crypto" "github.com/google/uuid" "github.com/sirupsen/logrus" - "io/ioutil" "os" "path/filepath" "time" @@ -49,23 +49,18 @@ func (d *Filedrop) Exists() bool { return utils.FileExists(filePath1) } -func (d *Filedrop) GetContent() (os.FileInfo, []byte, error) { +func (d *Filedrop) GetContent() (*os.File, *ucrypto.StreamDecrypter, error) { filePath1 := filepath.Join(FiledropFolder, d.FileName) f, err := os.Open(filePath1) if err != nil { return nil, nil, err } - defer f.Close() decrypter, err := utils.DecryptStream(d.IV, f) if err != nil { + f.Close() return nil, nil, err } - decFileBytes, _ := ioutil.ReadAll(decrypter) - fi, err := f.Stat() - if err != nil { - return nil, nil, err - } - return fi, decFileBytes, nil + return f, decrypter, nil } func (d *Filedrop) Delete() error { diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -3975,20 +3975,27 @@ func UploadsDownloadHandler(c echo.Context) error { func FiledropDownloadHandler(c echo.Context) error { filename := c.Param("filename") - file, err := database.GetFiledropByFileName(filename) + filedrop, err := database.GetFiledropByFileName(filename) if err != nil { return c.Redirect(http.StatusFound, "/") } - if !file.Exists() { + if !filedrop.Exists() { logrus.Error(filename + " does not exists") return c.Redirect(http.StatusFound, "/") } - fi, fileBytes, err := file.GetContent() + + osFile, decrypter, err := filedrop.GetContent() if err != nil { return echo.NotFoundHandler(c) } - c.Response().Header().Set(echo.HeaderContentDisposition, fmt.Sprintf("%s; filename=%q", "attachment", file.OrigFileName)) - http.ServeContent(c.Response(), c.Request(), fi.Name(), fi.ModTime(), bytes.NewReader(fileBytes)) + defer osFile.Close() + + c.Response().Header().Set(echo.HeaderContentDisposition, fmt.Sprintf("%s; filename=%q", "attachment", filedrop.OrigFileName)) + + if _, err := io.Copy(c.Response().Writer, decrypter); err != nil { + logrus.Error(err) + } + c.Response().Flush() return nil }