summaryrefslogtreecommitdiff
path: root/internal/api/client/fileserver/servefile.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2022-02-19 11:44:56 +0100
committerLibravatar GitHub <noreply@github.com>2022-02-19 11:44:56 +0100
commit23034ec145662b9edcd98df3a570e968389e3fa8 (patch)
treebb5678a1fae1c70a8a49b58ce17c5d51eae8710c /internal/api/client/fileserver/servefile.go
parentUse type=email for email input (#400) (diff)
downloadgotosocial-23034ec145662b9edcd98df3a570e968389e3fa8.tar.xz
[feature] Stream files via reader (#404)
* serve files via reader rather than byte slice * close readcloser when we're done with it * cast reader to readcloser
Diffstat (limited to 'internal/api/client/fileserver/servefile.go')
-rw-r--r--internal/api/client/fileserver/servefile.go13
1 files changed, 11 insertions, 2 deletions
diff --git a/internal/api/client/fileserver/servefile.go b/internal/api/client/fileserver/servefile.go
index 0caa81926..5a884dc47 100644
--- a/internal/api/client/fileserver/servefile.go
+++ b/internal/api/client/fileserver/servefile.go
@@ -19,7 +19,7 @@
package fileserver
import (
- "bytes"
+ "io"
"net/http"
"github.com/gin-gonic/gin"
@@ -91,6 +91,15 @@ func (m *FileServer) ServeFile(c *gin.Context) {
return
}
+ defer func() {
+ // if the content is a ReadCloser, close it when we're done
+ if closer, ok := content.Content.(io.ReadCloser); ok {
+ if err := closer.Close(); err != nil {
+ l.Errorf("error closing readcloser: %s", err)
+ }
+ }
+ }()
+
// TODO: if the requester only accepts text/html we should try to serve them *something*.
// This is mostly needed because when sharing a link to a gts-hosted file on something like mastodon, the masto servers will
// attempt to look up the content to provide a preview of the link, and they ask for text/html.
@@ -100,5 +109,5 @@ func (m *FileServer) ServeFile(c *gin.Context) {
return
}
- c.DataFromReader(http.StatusOK, content.ContentLength, format, bytes.NewReader(content.Content), nil)
+ c.DataFromReader(http.StatusOK, content.ContentLength, format, content.Content, nil)
}