fix: harden desktop release OSS uploads

This commit is contained in:
2026-06-22 23:49:24 +08:00
parent dcbab28e69
commit f0de364063
7 changed files with 218 additions and 63 deletions
+21 -13
View File
@@ -217,6 +217,26 @@ func aliyunStatusCode(err error) int {
}
func (c *aliyunClient) GetBytes(ctx context.Context, objectKey string) ([]byte, error) {
reader, err := c.GetReader(ctx, objectKey)
if err != nil {
return nil, err
}
defer reader.Close()
data, err := io.ReadAll(reader)
if err != nil {
c.logError(ctx, "aliyun read object failed",
zap.String("bucket", c.bucket),
zap.String("object_key", objectKey),
zap.Error(err),
)
return nil, fmt.Errorf("read aliyun object: %w", err)
}
return data, nil
}
func (c *aliyunClient) GetReader(ctx context.Context, objectKey string) (io.ReadCloser, error) {
if err := c.Validate(); err != nil {
return nil, err
}
@@ -243,19 +263,7 @@ func (c *aliyunClient) GetBytes(ctx context.Context, objectKey string) ([]byte,
}
return nil, fmt.Errorf("get aliyun object: %w", err)
}
defer reader.Close()
data, err := io.ReadAll(reader)
if err != nil {
c.logError(ctx, "aliyun read object failed",
zap.String("bucket", c.bucket),
zap.String("object_key", objectKey),
zap.Error(err),
)
return nil, fmt.Errorf("read aliyun object: %w", err)
}
return data, nil
return reader, nil
}
func isAliyunObjectNotFound(err error) bool {
@@ -33,6 +33,10 @@ type ReaderClient interface {
PutReader(ctx context.Context, objectKey string, reader io.Reader, size int64, contentType string) error
}
type ObjectReaderClient interface {
GetReader(ctx context.Context, objectKey string) (io.ReadCloser, error)
}
type PresignedPutResult struct {
URL string
Headers http.Header
+21 -13
View File
@@ -161,20 +161,9 @@ func (c *minioClient) PutReader(
}
func (c *minioClient) GetBytes(ctx context.Context, objectKey string) ([]byte, error) {
if err := c.Validate(); err != nil {
return nil, err
}
reader, err := c.client.GetObject(ctx, c.bucket, objectKey, minio.GetObjectOptions{})
reader, err := c.GetReader(ctx, objectKey)
if err != nil {
c.logError(ctx, "minio get object failed",
zap.String("bucket", c.bucket),
zap.String("object_key", objectKey),
zap.Error(err),
)
if isMinIOObjectNotFound(err) {
return nil, fmt.Errorf("%w: %s", ErrObjectNotFound, objectKey)
}
return nil, fmt.Errorf("get minio object: %w", err)
return nil, err
}
defer reader.Close()
@@ -193,6 +182,25 @@ func (c *minioClient) GetBytes(ctx context.Context, objectKey string) ([]byte, e
return data, nil
}
func (c *minioClient) GetReader(ctx context.Context, objectKey string) (io.ReadCloser, error) {
if err := c.Validate(); err != nil {
return nil, err
}
reader, err := c.client.GetObject(ctx, c.bucket, objectKey, minio.GetObjectOptions{})
if err != nil {
c.logError(ctx, "minio get object failed",
zap.String("bucket", c.bucket),
zap.String("object_key", objectKey),
zap.Error(err),
)
if isMinIOObjectNotFound(err) {
return nil, fmt.Errorf("%w: %s", ErrObjectNotFound, objectKey)
}
return nil, fmt.Errorf("get minio object: %w", err)
}
return reader, nil
}
func isMinIOObjectNotFound(err error) bool {
responseErr := minio.ToErrorResponse(err)
return responseErr.StatusCode == 404 ||
@@ -49,6 +49,15 @@ func (c *ReloadableClient) GetBytes(ctx context.Context, objectKey string) ([]by
return c.snapshot().GetBytes(ctx, objectKey)
}
func (c *ReloadableClient) GetReader(ctx context.Context, objectKey string) (io.ReadCloser, error) {
client := c.snapshot()
readerClient, ok := client.(ObjectReaderClient)
if !ok {
return nil, ErrNotConfigured
}
return readerClient.GetReader(ctx, objectKey)
}
func (c *ReloadableClient) Exists(ctx context.Context, objectKey string) (bool, error) {
return c.snapshot().Exists(ctx, objectKey)
}