summaryrefslogtreecommitdiff
path: root/internal/processing
diff options
context:
space:
mode:
Diffstat (limited to 'internal/processing')
-rw-r--r--internal/processing/media/getfile.go12
-rw-r--r--internal/processing/media/util.go14
2 files changed, 23 insertions, 3 deletions
diff --git a/internal/processing/media/getfile.go b/internal/processing/media/getfile.go
index 1faa8702f..c74951e38 100644
--- a/internal/processing/media/getfile.go
+++ b/internal/processing/media/getfile.go
@@ -180,9 +180,15 @@ func (p *processor) getAttachmentContent(ctx context.Context, requestingAccount
return nil, 0, err
}
- // everything read from the readCloser by the media manager will be written into the bufferedWriter
- teeReader := io.TeeReader(readCloser, bufferedWriter)
- return teeReader, fileSize, nil
+ // Make a TeeReader so that everything read from the readCloser by the media manager will be written into the bufferedWriter.
+ // We wrap this in a teeReadCloser which implements io.ReadCloser, so that whoever uses the teeReader can close the readCloser
+ // when they're done with it.
+ trc := teeReadCloser{
+ teeReader: io.TeeReader(readCloser, bufferedWriter),
+ close: readCloser.Close,
+ }
+
+ return trc, fileSize, nil
}
// close the pipewriter after data has been piped into it, so the reader on the other side doesn't block;
diff --git a/internal/processing/media/util.go b/internal/processing/media/util.go
index 37dc87979..9739e70b7 100644
--- a/internal/processing/media/util.go
+++ b/internal/processing/media/util.go
@@ -20,6 +20,7 @@ package media
import (
"fmt"
+ "io"
"strconv"
"strings"
)
@@ -61,3 +62,16 @@ func parseFocus(focus string) (focusx, focusy float32, err error) {
focusy = float32(fy)
return
}
+
+type teeReadCloser struct {
+ teeReader io.Reader
+ close func() error
+}
+
+func (t teeReadCloser) Read(p []byte) (n int, err error) {
+ return t.teeReader.Read(p)
+}
+
+func (t teeReadCloser) Close() error {
+ return t.close()
+}