diff --git a/backend/azure/azure.go b/backend/azure/azure.go index 562e23a7..1e029d36 100644 --- a/backend/azure/azure.go +++ b/backend/azure/azure.go @@ -19,15 +19,14 @@ import ( "context" "encoding/base64" "encoding/binary" - "errors" "fmt" "io" "math" "os" "strconv" "strings" + "time" - "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/streaming" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" @@ -532,9 +531,10 @@ func (az *Azure) ListParts(ctx context.Context, input *s3.ListPartsInput) (s3res break } parts = append(parts, s3response.Part{ - Size: *el.Size, - ETag: *el.Name, - PartNumber: partNumber, + Size: *el.Size, + ETag: *el.Name, + PartNumber: partNumber, + LastModified: time.Now().Format(backend.RFC3339TimeFormat), }) } return s3response.ListPartsResult{ @@ -774,21 +774,6 @@ func getString(str *string) string { return *str } -// Parses azure ResponseError into AWS APIError -func azureErrToS3Err(apiErr error) error { - var azErr *azcore.ResponseError - if !errors.As(apiErr, &azErr) { - return apiErr - } - - resp := s3err.APIError{ - Code: azErr.ErrorCode, - Description: azErr.RawResponse.Status, - HTTPStatusCode: azErr.StatusCode, - } - return resp -} - // Converts io.Reader into io.ReadSeekCloser func getReadSeekCloser(input io.Reader) (io.ReadSeekCloser, error) { var buffer bytes.Buffer diff --git a/backend/azure/err.go b/backend/azure/err.go new file mode 100644 index 00000000..2a33012f --- /dev/null +++ b/backend/azure/err.go @@ -0,0 +1,50 @@ +// Copyright 2023 Versity Software +// This file is licensed under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package azure + +import ( + "errors" + + "github.com/Azure/azure-sdk-for-go/sdk/azcore" + "github.com/versity/versitygw/s3err" +) + +// Parses azure ResponseError into AWS APIError +func azureErrToS3Err(apiErr error) error { + var azErr *azcore.ResponseError + if !errors.As(apiErr, &azErr) { + return apiErr + } + + return azErrToS3err(azErr) +} + +func azErrToS3err(azErr *azcore.ResponseError) s3err.APIError { + switch azErr.ErrorCode { + case "ContainerAlreadyExists": + return s3err.GetAPIError(s3err.ErrBucketAlreadyExists) + case "InvalidResourceName", "ContainerNotFound": + return s3err.GetAPIError(s3err.ErrNoSuchBucket) + case "BlobNotFound": + return s3err.GetAPIError(s3err.ErrNoSuchKey) + case "TagsTooLarge": + return s3err.GetAPIError(s3err.ErrInvalidTag) + } + return s3err.APIError{ + Code: azErr.ErrorCode, + Description: azErr.RawResponse.Status, + HTTPStatusCode: azErr.StatusCode, + } +}