summaryrefslogtreecommitdiff
path: root/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2024-08-02 11:46:41 +0000
committerLibravatar GitHub <noreply@github.com>2024-08-02 12:46:41 +0100
commit94e87610c4ce9bbb1c614a61bab29c1422fed11b (patch)
tree2e06b8ce64212140e796f6077ba841b6cc678501 /vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go
parent[feature] Allow import of following and blocks via CSV (#3150) (diff)
downloadgotosocial-94e87610c4ce9bbb1c614a61bab29c1422fed11b.tar.xz
[chore] add back exif-terminator and use only for jpeg,png,webp (#3161)
* add back exif-terminator and use only for jpeg,png,webp * fix arguments passed to terminateExif() * pull in latest exif-terminator * fix test * update processed img --------- Co-authored-by: tobi <tobi.smethurst@protonmail.com>
Diffstat (limited to 'vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go')
-rw-r--r--vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go b/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go
new file mode 100644
index 000000000..8705e5fe0
--- /dev/null
+++ b/vendor/github.com/dsoprea/go-utility/v2/filesystem/graceful_copy.go
@@ -0,0 +1,54 @@
+package rifs
+
+import (
+ "fmt"
+ "io"
+)
+
+const (
+ defaultCopyBufferSize = 1024 * 1024
+)
+
+// GracefulCopy willcopy while enduring lesser normal issues.
+//
+// - We'll ignore EOF if the read byte-count is more than zero. Only an EOF when
+// zero bytes were read will terminate the loop.
+//
+// - Ignore short-writes. If less bytes were written than the bytes that were
+// given, we'll keep trying until done.
+func GracefulCopy(w io.Writer, r io.Reader, buffer []byte) (copyCount int, err error) {
+ if buffer == nil {
+ buffer = make([]byte, defaultCopyBufferSize)
+ }
+
+ for {
+ readCount, err := r.Read(buffer)
+ if err != nil {
+ if err != io.EOF {
+ err = fmt.Errorf("read error: %s", err.Error())
+ return 0, err
+ }
+
+ // Only break on EOF if no bytes were actually read.
+ if readCount == 0 {
+ break
+ }
+ }
+
+ writeBuffer := buffer[:readCount]
+
+ for len(writeBuffer) > 0 {
+ writtenCount, err := w.Write(writeBuffer)
+ if err != nil {
+ err = fmt.Errorf("write error: %s", err.Error())
+ return 0, err
+ }
+
+ writeBuffer = writeBuffer[writtenCount:]
+ }
+
+ copyCount += readCount
+ }
+
+ return copyCount, nil
+}