diff --git a/api/auth/center_test.go b/api/auth/center_test.go index 416806ed..a11b6416 100644 --- a/api/auth/center_test.go +++ b/api/auth/center_test.go @@ -3,8 +3,10 @@ package auth import ( "bytes" "encoding/hex" + "fmt" "io" "net/http" + "strconv" "strings" "testing" "time" @@ -347,7 +349,7 @@ func TestAwsEncodedChunkReader(t *testing.T) { } func TestAwsEncodedWithRequest(t *testing.T) { - // t.Skipf("Only for manual launch") + t.Skipf("Only for manual launch") ts := time.Now() @@ -362,69 +364,94 @@ func TestAwsEncodedWithRequest(t *testing.T) { payload[i] = 'a' } - req, err := http.NewRequest("PUT", fmt.Sprintf("%s/%s/%s.txt", host, bucketName, fileName), nil) - require.NoError(t, err) - - tsISO8601 := ts.Format(timeFormatISO8601) - - req.Header.Set("x-amz-date", tsISO8601) - req.Header.Set("x-amz-content-sha256", "STREAMING-AWS4-HMAC-SHA256-PAYLOAD") - req.Header.Set("content-encoding", "aws-chunked") - req.Header.Set("x-amz-decoded-content-length", strconv.Itoa(totalPayloadLength)) - awsCreds := credentials.NewStaticCredentials( "9RiJXNmiACwhNaf6cRTvHFyjkUXgxMF6JL6NT7CLEH7n0C6mi5Pioz46GAGzJDnj1Ws5PJiUG4uH5UpoPFRUqfwUf", // access_key_id "5dc3ae7cd2575df3f8c4d9e59920c55c6630c187657232f5369f32e3a9fc0795", // secret_access_key "") - signer := v4.NewSigner(awsCreds) + t.Run("upload object", func(t *testing.T) { + req, err := http.NewRequest("PUT", fmt.Sprintf("%s/%s/%s.txt", host, bucketName, fileName), nil) + require.NoError(t, err) - signer.DisableURIPathEscaping = true - _, err = signer.Sign(req, nil, "s3", "us-east-1", ts) - require.NoError(t, err) + tsISO8601 := ts.Format(timeFormatISO8601) - reg := NewRegexpMatcher(authorizationFieldRegexp) - signature := reg.GetSubmatches(req.Header.Get(AuthorizationHdr))["v4_signature"] + req.Header.Set("x-amz-date", tsISO8601) + req.Header.Set("x-amz-content-sha256", "STREAMING-AWS4-HMAC-SHA256-PAYLOAD") + req.Header.Set("content-encoding", "aws-chunked") + req.Header.Set("x-amz-decoded-content-length", strconv.Itoa(totalPayloadLength)) - seedSignature, err := hex.DecodeString(signature) - require.NoError(t, err) + signer := v4.NewSigner(awsCreds) + + signer.DisableURIPathEscaping = true + _, err = signer.Sign(req, nil, "s3", "us-east-1", ts) + require.NoError(t, err) - buff := bytes.NewBuffer(nil) - chunks := chunkSlice(payload, chunkSize) - streamSigner := v4.NewStreamSigner("us-east-1", "s3", seedSignature, ts, awsCreds) + reg := NewRegexpMatcher(authorizationFieldRegexp) + signature := reg.GetSubmatches(req.Header.Get(AuthorizationHdr))["v4_signature"] - for i, chunkPayload := range chunks { - chunkSignature, err := streamSigner.GetSignature(chunkPayload) + seedSignature, err := hex.DecodeString(signature) require.NoError(t, err) - var body []byte - if i > 0 { - body = []byte{'\r', '\n'} + buff := bytes.NewBuffer(nil) + chunks := chunkSlice(payload, chunkSize) + streamSigner := v4.NewStreamSigner("us-east-1", "s3", seedSignature, ts, awsCreds) + + for i, chunkPayload := range chunks { + chunkSignature, err := streamSigner.GetSignature(chunkPayload) + require.NoError(t, err) + + var body []byte + if i > 0 { + body = []byte{'\r', '\n'} + } + + body = append(body, []byte(strconv.FormatInt(int64(len(chunkPayload)), 16)+";chunk-signature=")...) + body = append(body, []byte(hex.EncodeToString(chunkSignature))...) + body = append(body, '\n') + body = append(body, chunkPayload...) + + _, err = buff.Write(body) + require.NoError(t, err) } - body = append(body, []byte(strconv.FormatInt(int64(len(chunkPayload)), 16)+";chunk-signature=")...) - body = append(body, []byte(hex.EncodeToString(chunkSignature))...) - body = append(body, '\n') - body = append(body, chunkPayload...) + // the last chunk always has no data and zero length. + signChunk, err := streamSigner.GetSignature(nil) + require.NoError(t, err) - _, err = buff.Write(body) + chunk3Body := append([]byte("\r\n0;chunk-signature="), []byte(hex.EncodeToString(signChunk))...) + chunk3Body = append(chunk3Body, '\n') + _, err = buff.Write(chunk3Body) require.NoError(t, err) - } - // the last chunk always has no data and zero length. - signChunk, err := streamSigner.GetSignature(nil) - require.NoError(t, err) + req.Body = io.NopCloser(buff) + req.Header.Set("content-length", strconv.Itoa(buff.Len())) - chunk3Body := append([]byte("\r\n0;chunk-signature="), []byte(hex.EncodeToString(signChunk))...) - chunk3Body = append(chunk3Body, '\n') - _, err = buff.Write(chunk3Body) - require.NoError(t, err) + _, err = http.DefaultClient.Do(req) + require.NoError(t, err) + }) - req.Body = io.NopCloser(buff) - req.Header.Set("content-length", strconv.Itoa(buff.Len())) + t.Run("download object", func(t *testing.T) { + req, err := http.NewRequest("GET", fmt.Sprintf("%s/%s/%s.txt", host, bucketName, fileName), nil) + require.NoError(t, err) - _, err = http.DefaultClient.Do(req) - require.NoError(t, err) + signer := v4.NewSigner(awsCreds) + + signer.DisableURIPathEscaping = true + _, err = signer.Sign(req, nil, "s3", "us-east-1", ts) + require.NoError(t, err) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + + defer func() { + _ = resp.Body.Close() + }() + + downloaded, err := io.ReadAll(resp.Body) + require.NoError(t, err) + + require.Equal(t, payload, downloaded) + }) } func chunkSlice(payload []byte, chunkSize int) [][]byte {