aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2025-07-07 02:18:57 +0500
committerGitHub <noreply@github.com>2025-07-06 14:18:57 -0700
commitfd4154cfed0727bac3015587087ffda6fe2cddde (patch)
treec48e18626161acec3afa977aec4ca73839f10f9f
parent798f797158d857600824693df46310fb074fb7b1 (diff)
downloadseaweedfs-fd4154cfed0727bac3015587087ffda6fe2cddde.tar.xz
seaweedfs-fd4154cfed0727bac3015587087ffda6fe2cddde.zip
fix: s3 return BadDigest (#6714)
* fix: s3 return BadDigest * adjust error message checking --------- Co-authored-by: chrislu <chris.lu@gmail.com>
-rw-r--r--weed/s3api/chunked_reader_v4.go7
-rw-r--r--weed/s3api/s3api_object_handlers_put.go3
-rw-r--r--weed/s3api/s3err/s3api_errors.go7
3 files changed, 13 insertions, 4 deletions
diff --git a/weed/s3api/chunked_reader_v4.go b/weed/s3api/chunked_reader_v4.go
index d8fdc7525..6ee46c82b 100644
--- a/weed/s3api/chunked_reader_v4.go
+++ b/weed/s3api/chunked_reader_v4.go
@@ -379,16 +379,15 @@ func (cr *s3ChunkedReader) Read(buf []byte) (n int, err error) {
if extractedCheckSumAlgorithm.String() != cr.checkSumAlgorithm {
errorMessage := fmt.Sprintf("checksum algorithm in trailer '%s' does not match the one advertised in the header '%s'", extractedCheckSumAlgorithm.String(), cr.checkSumAlgorithm)
glog.V(3).Info(errorMessage)
- cr.err = errors.New(errorMessage)
+ cr.err = errors.New(s3err.ErrMsgChecksumAlgorithmMismatch)
return 0, cr.err
}
computedChecksum := cr.checkSumWriter.Sum(nil)
base64Checksum := base64.StdEncoding.EncodeToString(computedChecksum)
if string(extractedChecksum) != base64Checksum {
- // TODO: Return BadDigest
glog.V(3).Infof("payload checksum '%s' does not match provided checksum '%s'", base64Checksum, string(extractedChecksum))
- cr.err = errors.New("payload checksum does not match")
+ cr.err = errors.New(s3err.ErrMsgPayloadChecksumMismatch)
return 0, cr.err
}
@@ -449,7 +448,7 @@ func (cr *s3ChunkedReader) Read(buf []byte) (n int, err error) {
newSignature := cr.getChunkSignature(hashedChunk)
if !compareSignatureV4(cr.chunkSignature, newSignature) {
// Chunk signature doesn't match we return signature does not match.
- cr.err = errors.New("chunk signature does not match")
+ cr.err = errors.New(s3err.ErrMsgChunkSignatureMismatch)
return 0, cr.err
}
// Newly calculated signature becomes the seed for the next chunk
diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go
index 716fec0aa..0b0be5fe5 100644
--- a/weed/s3api/s3api_object_handlers_put.go
+++ b/weed/s3api/s3api_object_handlers_put.go
@@ -126,6 +126,9 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader
if postErr != nil {
glog.Errorf("post to filer: %v", postErr)
+ if strings.Contains(postErr.Error(), s3err.ErrMsgPayloadChecksumMismatch) {
+ return "", s3err.ErrInvalidDigest
+ }
return "", s3err.ErrInternalError
}
defer resp.Body.Close()
diff --git a/weed/s3api/s3err/s3api_errors.go b/weed/s3api/s3err/s3api_errors.go
index f41c3620c..bcb0a26a8 100644
--- a/weed/s3api/s3err/s3api_errors.go
+++ b/weed/s3api/s3err/s3api_errors.go
@@ -112,6 +112,13 @@ const (
ErrNoSuchTagSet
)
+// Error message constants for checksum validation
+const (
+ ErrMsgPayloadChecksumMismatch = "payload checksum does not match"
+ ErrMsgChunkSignatureMismatch = "chunk signature does not match"
+ ErrMsgChecksumAlgorithmMismatch = "checksum algorithm mismatch"
+)
+
// error code to APIError structure, these fields carry respective
// descriptions for all the error responses.
var errorCodeResponse = map[ErrorCode]APIError{