commit 8531d14089c96b1c60326fcc331d8e75f214061e
parent fd73a1d66de5f3d8b8951137c12cd301d9d7324c
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Wed, 25 Jan 2023 23:36:21 -0800
efficient filedrop stream downloader
Diffstat:
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
}