diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index cbd8da54f..cc2fb3dfd 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -383,6 +383,9 @@ func filerErrorToS3Error(errString string) s3err.ErrorCode { switch { case errString == constants.ErrMsgBadDigest: return s3err.ErrBadDigest + case strings.Contains(errString, "context canceled") || strings.Contains(errString, "code = Canceled"): + // Client canceled the request, return client error not server error + return s3err.ErrInvalidRequest case strings.HasPrefix(errString, "existing ") && strings.HasSuffix(errString, "is a directory"): return s3err.ErrExistingObjectIsDirectory case strings.HasSuffix(errString, "is a file"): diff --git a/weed/s3api/s3api_object_handlers_put_test.go b/weed/s3api/s3api_object_handlers_put_test.go index 87b874e1f..9144e2cee 100644 --- a/weed/s3api/s3api_object_handlers_put_test.go +++ b/weed/s3api/s3api_object_handlers_put_test.go @@ -18,6 +18,16 @@ func TestFilerErrorToS3Error(t *testing.T) { errString: constants.ErrMsgBadDigest, expectedErr: s3err.ErrBadDigest, }, + { + name: "Context canceled error", + errString: "rpc error: code = Canceled desc = context canceled", + expectedErr: s3err.ErrInvalidRequest, + }, + { + name: "Context canceled error (simple)", + errString: "context canceled", + expectedErr: s3err.ErrInvalidRequest, + }, { name: "Directory exists error", errString: "existing /path/to/file is a directory",