From 0fbdedecc741ca71455b7ab8058cddd54939c82f Mon Sep 17 00:00:00 2001 From: Taehyung Lim Date: Fri, 2 May 2025 05:08:03 +0900 Subject: [PATCH] [s3] refactor duplicate put-object code paths (#6727) --- weed/s3api/s3api_object_handlers_multipart.go | 25 +++------------- weed/s3api/s3api_object_handlers_put.go | 25 +++------------- weed/s3api/s3api_put_object_helper.go | 30 +++++++++++++++++++ 3 files changed, 38 insertions(+), 42 deletions(-) create mode 100644 weed/s3api/s3api_put_object_helper.go diff --git a/weed/s3api/s3api_object_handlers_multipart.go b/weed/s3api/s3api_object_handlers_multipart.go index ef63e6e97..dfd9f5844 100644 --- a/weed/s3api/s3api_object_handlers_multipart.go +++ b/weed/s3api/s3api_object_handlers_multipart.go @@ -229,27 +229,10 @@ func (s3a *S3ApiServer) PutObjectPartHandler(w http.ResponseWriter, r *http.Requ return } - dataReader := r.Body - rAuthType := getRequestAuthType(r) - if s3a.iam.isEnabled() { - var s3ErrCode s3err.ErrorCode - switch rAuthType { - case authTypeStreamingSigned, authTypeStreamingUnsigned: - dataReader, s3ErrCode = s3a.iam.newChunkedReader(r) - case authTypeSignedV2, authTypePresignedV2: - _, s3ErrCode = s3a.iam.isReqAuthenticatedV2(r) - case authTypePresigned, authTypeSigned: - _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) - } - if s3ErrCode != s3err.ErrNone { - s3err.WriteErrorResponse(w, r, s3ErrCode) - return - } - } else { - if authTypeStreamingSigned == rAuthType { - s3err.WriteErrorResponse(w, r, s3err.ErrAuthNotSetup) - return - } + dataReader, s3ErrCode := getRequestDataReader(s3a, r) + if s3ErrCode != s3err.ErrNone { + s3err.WriteErrorResponse(w, r, s3ErrCode) + return } defer dataReader.Close() diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index 4c714f8c3..716fec0aa 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -47,27 +47,10 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request) } } - dataReader := r.Body - rAuthType := getRequestAuthType(r) - if s3a.iam.isEnabled() { - var s3ErrCode s3err.ErrorCode - switch rAuthType { - case authTypeStreamingSigned, authTypeStreamingUnsigned: - dataReader, s3ErrCode = s3a.iam.newChunkedReader(r) - case authTypeSignedV2, authTypePresignedV2: - _, s3ErrCode = s3a.iam.isReqAuthenticatedV2(r) - case authTypePresigned, authTypeSigned: - _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) - } - if s3ErrCode != s3err.ErrNone { - s3err.WriteErrorResponse(w, r, s3ErrCode) - return - } - } else { - if authTypeStreamingSigned == rAuthType { - s3err.WriteErrorResponse(w, r, s3err.ErrAuthNotSetup) - return - } + dataReader, s3ErrCode := getRequestDataReader(s3a, r) + if s3ErrCode != s3err.ErrNone { + s3err.WriteErrorResponse(w, r, s3ErrCode) + return } defer dataReader.Close() diff --git a/weed/s3api/s3api_put_object_helper.go b/weed/s3api/s3api_put_object_helper.go new file mode 100644 index 000000000..f1348aa0e --- /dev/null +++ b/weed/s3api/s3api_put_object_helper.go @@ -0,0 +1,30 @@ +package s3api + +import ( + "io" + "net/http" + + "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" +) + +func getRequestDataReader(s3a *S3ApiServer, r *http.Request) (io.ReadCloser, s3err.ErrorCode) { + var s3ErrCode s3err.ErrorCode + dataReader := r.Body + rAuthType := getRequestAuthType(r) + if s3a.iam.isEnabled() { + switch rAuthType { + case authTypeStreamingSigned, authTypeStreamingUnsigned: + dataReader, s3ErrCode = s3a.iam.newChunkedReader(r) + case authTypeSignedV2, authTypePresignedV2: + _, s3ErrCode = s3a.iam.isReqAuthenticatedV2(r) + case authTypePresigned, authTypeSigned: + _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r) + } + } else { + if authTypeStreamingSigned == rAuthType { + s3ErrCode = s3err.ErrAuthNotSetup + } + } + + return dataReader, s3ErrCode +}