chunked_reader_v4_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package s3api
  2. import (
  3. "bytes"
  4. "io"
  5. "net/http"
  6. "strings"
  7. "sync"
  8. "testing"
  9. "github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. // This test will implement the following scenario:
  13. // https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#example-signature-calculations-streaming
  14. const (
  15. defaultTimestamp = "20130524T000000Z"
  16. defaultBucketName = "examplebucket"
  17. defaultAccessKeyId = "AKIAIOSFODNN7EXAMPLE"
  18. defaultSecretAccessKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
  19. defaultRegion = "us-east-1"
  20. )
  21. func generatePayload() string {
  22. chunk1 := "10000;chunk-signature=ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648\r\n" +
  23. strings.Repeat("a", 65536) + "\r\n"
  24. chunk2 := "400;chunk-signature=0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497\r\n" +
  25. strings.Repeat("a", 1024) + "\r\n"
  26. chunk3 := "0;chunk-signature=b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9\r\n\r\n"
  27. payload := chunk1 + chunk2 + chunk3
  28. return payload
  29. }
  30. func NewRequest() (*http.Request, error) {
  31. payload := generatePayload()
  32. req, err := http.NewRequest("PUT", "http://s3.amazonaws.com/examplebucket/chunkObject.txt", bytes.NewReader([]byte(payload)))
  33. if err != nil {
  34. return nil, err
  35. }
  36. req.Header.Set("Host", "s3.amazonaws.com")
  37. req.Header.Set("x-amz-date", defaultTimestamp)
  38. req.Header.Set("x-amz-storage-class", "REDUCED_REDUNDANCY")
  39. req.Header.Set("Authorization", "AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request,SignedHeaders=content-encoding;content-length;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-storage-class,Signature=4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9")
  40. req.Header.Set("x-amz-content-sha256", "STREAMING-AWS4-HMAC-SHA256-PAYLOAD")
  41. req.Header.Set("Content-Encoding", "aws-chunked")
  42. req.Header.Set("x-amz-decoded-content-length", "66560")
  43. req.Header.Set("Content-Length", "66824")
  44. return req, nil
  45. }
  46. func TestNewSignV4ChunkedReader(t *testing.T) {
  47. req, err := NewRequest()
  48. if err != nil {
  49. t.Fatalf("Failed to create request: %v", err)
  50. }
  51. // Create an IdentityAccessManagement instance
  52. iam := IdentityAccessManagement{
  53. identities: []*Identity{},
  54. accessKeyIdent: map[string]*Identity{},
  55. accounts: map[string]*Account{},
  56. emailAccount: map[string]*Account{},
  57. hashes: map[string]*sync.Pool{},
  58. hashCounters: map[string]*int32{},
  59. identityAnonymous: nil,
  60. domain: "",
  61. isAuthEnabled: false,
  62. }
  63. // Add default access keys and secrets
  64. iam.identities = append(iam.identities, &Identity{
  65. Name: "default",
  66. Credentials: []*Credential{
  67. {
  68. AccessKey: defaultAccessKeyId,
  69. SecretKey: defaultSecretAccessKey,
  70. },
  71. },
  72. Actions: []Action{
  73. "Read",
  74. "Write",
  75. "List",
  76. },
  77. })
  78. iam.accessKeyIdent[defaultAccessKeyId] = iam.identities[0]
  79. // Call newSignV4ChunkedReader
  80. reader, errCode := iam.newSignV4ChunkedReader(req)
  81. assert.NotNil(t, reader)
  82. assert.Equal(t, s3err.ErrNone, errCode)
  83. data, err := io.ReadAll(reader)
  84. if err != nil {
  85. t.Fatalf("Failed to read data: %v", err)
  86. }
  87. // The expected payload a long string of 'a's
  88. expectedPayload := strings.Repeat("a", 66560)
  89. assert.Equal(t, expectedPayload, string(data))
  90. }