s3api_put_object_helper.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package s3api
  2. import (
  3. "io"
  4. "net/http"
  5. "github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
  6. )
  7. // getRequestDataReader returns the appropriate reader for the request body.
  8. // When IAM is disabled, it still processes chunked transfer encoding for
  9. // authTypeStreamingUnsigned to strip checksum headers and extract the actual data.
  10. // This fixes issues where chunked data with checksums would be stored incorrectly
  11. // when IAM is not enabled.
  12. func getRequestDataReader(s3a *S3ApiServer, r *http.Request) (io.ReadCloser, s3err.ErrorCode) {
  13. var s3ErrCode s3err.ErrorCode
  14. dataReader := r.Body
  15. rAuthType := getRequestAuthType(r)
  16. if s3a.iam.isEnabled() {
  17. switch rAuthType {
  18. case authTypeStreamingSigned, authTypeStreamingUnsigned:
  19. dataReader, s3ErrCode = s3a.iam.newChunkedReader(r)
  20. case authTypeSignedV2, authTypePresignedV2:
  21. _, s3ErrCode = s3a.iam.isReqAuthenticatedV2(r)
  22. case authTypePresigned, authTypeSigned:
  23. _, s3ErrCode = s3a.iam.reqSignatureV4Verify(r)
  24. }
  25. } else {
  26. switch rAuthType {
  27. case authTypeStreamingSigned:
  28. s3ErrCode = s3err.ErrAuthNotSetup
  29. case authTypeStreamingUnsigned:
  30. // Even when IAM is disabled, we still need to handle chunked transfer encoding
  31. // to strip checksum headers and process the data correctly
  32. dataReader, s3ErrCode = s3a.iam.newChunkedReader(r)
  33. }
  34. }
  35. return dataReader, s3ErrCode
  36. }