From 298256a902e6219b3672a518c85ca8199ad6bf93 Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Thu, 27 Mar 2025 09:14:08 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8A=A0=E9=94=81=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/io2/io.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/utils/io2/io.go b/utils/io2/io.go index 5107ae0..da57b92 100644 --- a/utils/io2/io.go +++ b/utils/io2/io.go @@ -1,6 +1,9 @@ package io2 -import "io" +import ( + "io" + "sync" +) type PromiseWriteCloser[T any] interface { io.Writer @@ -35,6 +38,7 @@ type readCloserHook struct { callback func(closer io.ReadCloser) once int isBefore bool // callback调用时机,true则在closer的Close之前调用 + lock *sync.Mutex } func (hook *readCloserHook) Read(buf []byte) (n int, err error) { @@ -42,6 +46,9 @@ func (hook *readCloserHook) Read(buf []byte) (n int, err error) { } func (hook *readCloserHook) Close() error { + hook.lock.Lock() + defer hook.lock.Unlock() + if hook.once == onceDone { return hook.readCloser.Close() } @@ -69,6 +76,7 @@ func BeforeReadClosing(closer io.ReadCloser, callback func(closer io.ReadCloser) callback: callback, once: onceDisabled, isBefore: true, + lock: &sync.Mutex{}, } } @@ -78,6 +86,7 @@ func AfterReadClosed(closer io.ReadCloser, callback func(closer io.ReadCloser)) callback: callback, once: onceDisabled, isBefore: false, + lock: &sync.Mutex{}, } } @@ -87,16 +96,22 @@ func AfterReadClosedOnce(closer io.ReadCloser, callback func(closer io.ReadClose callback: callback, once: onceEnabled, isBefore: false, + lock: &sync.Mutex{}, } } type afterEOF struct { inner io.ReadCloser callback func(str io.ReadCloser, err error) + lock *sync.Mutex } func (hook *afterEOF) Read(buf []byte) (n int, err error) { n, err = hook.inner.Read(buf) + + hook.lock.Lock() + defer hook.lock.Unlock() + if hook.callback != nil { if err == io.EOF { hook.callback(hook.inner, nil) @@ -111,6 +126,10 @@ func (hook *afterEOF) Read(buf []byte) (n int, err error) { func (hook *afterEOF) Close() error { err := hook.inner.Close() + + hook.lock.Lock() + defer hook.lock.Unlock() + if hook.callback != nil { hook.callback(hook.inner, io.ErrClosedPipe) hook.callback = nil @@ -122,6 +141,7 @@ func AfterEOF(str io.ReadCloser, callback func(str io.ReadCloser, err error)) io return &afterEOF{ inner: str, callback: callback, + lock: &sync.Mutex{}, } } From 07fa8a6fcd60ad97102fa3ea9f8311946c79aebd Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Thu, 27 Mar 2025 11:11:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=94=AF=E6=8C=81=E9=A2=84=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdks/storage/cdsapi/presigned.go | 10 ++++++++++ sdks/storage/cdsapi/presigned_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/sdks/storage/cdsapi/presigned.go b/sdks/storage/cdsapi/presigned.go index b357e71..99bf8b2 100644 --- a/sdks/storage/cdsapi/presigned.go +++ b/sdks/storage/cdsapi/presigned.go @@ -23,6 +23,16 @@ func (c *Client) Presigned() *PresignedService { } } +const PresignedObjectListByPathPath = "/v1/presigned/object/listByPath" + +type PresignedObjectListByPath struct { + ObjectListByPath +} + +func (c *PresignedService) ObjectListByPath(req PresignedObjectListByPath, expireIn int) (string, error) { + return c.presign(req, PresignedObjectListByPathPath, http.MethodGet, expireIn) +} + const PresignedObjectDownloadByPathPath = "/v1/presigned/object/downloadByPath" type PresignedObjectDownloadByPath struct { diff --git a/sdks/storage/cdsapi/presigned_test.go b/sdks/storage/cdsapi/presigned_test.go index f4071c9..7379951 100644 --- a/sdks/storage/cdsapi/presigned_test.go +++ b/sdks/storage/cdsapi/presigned_test.go @@ -39,6 +39,31 @@ func Test_Presigned(t *testing.T) { }) } +func Test_PresignedObjectListByPath(t *testing.T) { + cli := NewClient(&Config{ + URL: "http://localhost:7890", + AccessKey: "123456", + SecretKey: "123456", + }) + + Convey("下载文件", t, func() { + pre := cli.Presigned() + url, err := pre.ObjectListByPath(PresignedObjectListByPath{ + ObjectListByPath: ObjectListByPath{ + UserID: 1, + PackageID: 12, + Path: "a/", + IsPrefix: true, + NoRecursive: true, + MaxKeys: 10, + ContinuationToken: "123456", + }, + }, 100) + So(err, ShouldEqual, nil) + t.Logf("url: %s", url) + }) +} + func Test_PresignedObjectDownloadByPath(t *testing.T) { cli := NewClient(&Config{ URL: "http://localhost:7890", From d66f32af17037f00c4e2540365bb8a392929eb1b Mon Sep 17 00:00:00 2001 From: Sydonian <794346190@qq.com> Date: Mon, 31 Mar 2025 17:26:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=B5=81=E6=97=B6=E9=94=99=E8=AF=AF=E5=A4=84?= =?UTF-8?q?=E7=90=86EOF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/io2/range.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/utils/io2/range.go b/utils/io2/range.go index a4a0b35..46b4add 100644 --- a/utils/io2/range.go +++ b/utils/io2/range.go @@ -37,16 +37,22 @@ func (r *rng) Read(p []byte) (n int, err error) { need := math2.Min(*r.length, int64(len(p))) rd, err := r.inner.Read(p[:need]) - if err != nil { - r.err = err - return rd, io.EOF - } *r.length -= int64(rd) if *r.length == 0 { r.err = io.EOF } + if err == nil { + return rd, nil + } + + if err != io.EOF { + r.err = err + return rd, err + } + + r.err = io.EOF return rd, nil }