diff --git a/api/handler/put_test.go b/api/handler/put_test.go index 152a969..e3d6c7e 100644 --- a/api/handler/put_test.go +++ b/api/handler/put_test.go @@ -28,6 +28,11 @@ import ( "github.com/stretchr/testify/require" ) +const ( + awsChunkedRequestExampleDecodedContentLength = 66560 + awsChunkedRequestExampleContentLength = 66824 +) + func TestCheckBucketName(t *testing.T) { for _, tc := range []struct { name string @@ -274,7 +279,12 @@ func TestPutObjectWithStreamBodyAWSExample(t *testing.T) { hc.Handler().PutObjectHandler(w, req) assertStatus(t, w, http.StatusOK) - data := getObjectRange(t, hc, bktName, objName, 0, 66824) + w, req = prepareTestRequest(hc, bktName, objName, nil) + hc.Handler().HeadObjectHandler(w, req) + assertStatus(t, w, http.StatusOK) + require.Equal(t, strconv.Itoa(awsChunkedRequestExampleDecodedContentLength), w.Header().Get(api.ContentLength)) + + data := getObjectRange(t, hc, bktName, objName, 0, awsChunkedRequestExampleDecodedContentLength) for i := range chunk { require.Equal(t, chunk[i], data[i]) } @@ -310,6 +320,8 @@ func TestPutChunkedTestContentEncoding(t *testing.T) { require.Equal(t, "gzip", resp.Header().Get(api.ContentEncoding)) } +// getChunkedRequest implements request example from +// https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html func getChunkedRequest(ctx context.Context, t *testing.T, bktName, objName string) (*httptest.ResponseRecorder, *http.Request, []byte) { chunk := make([]byte, 65*1024) for i := range chunk { @@ -337,9 +349,9 @@ func getChunkedRequest(ctx context.Context, t *testing.T, bktName, objName strin req, err := http.NewRequest("PUT", "https://s3.amazonaws.com/"+bktName+"/"+objName, nil) require.NoError(t, err) req.Header.Set("content-encoding", "aws-chunked") - req.Header.Set("content-length", "66824") + req.Header.Set("content-length", strconv.Itoa(awsChunkedRequestExampleContentLength)) req.Header.Set("x-amz-content-sha256", "STREAMING-AWS4-HMAC-SHA256-PAYLOAD") - req.Header.Set("x-amz-decoded-content-length", "66560") + req.Header.Set("x-amz-decoded-content-length", strconv.Itoa(awsChunkedRequestExampleDecodedContentLength)) req.Header.Set("x-amz-storage-class", "REDUCED_REDUNDANCY") signTime, err := time.Parse("20060102T150405Z", "20130524T000000Z")