fix: harden desktop release OSS uploads
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user