示例#1
0
        public async Task ListParts()
        {
            await CreateTempBucketAsync(async bucket =>
            {
                //We add the special characters at the end to test EncodingType support.
                string objName = nameof(ListParts) + "%";

                CreateMultipartUploadResponse createResp = await MultipartClient.CreateMultipartUploadAsync(bucket, objName).ConfigureAwait(false);

                ListPartsResponse listResp1 = await MultipartClient.ListPartsAsync(bucket, objName, createResp.UploadId).ConfigureAwait(false);

                Assert.Equal(bucket, listResp1.BucketName);
                Assert.Equal(objName, listResp1.ObjectKey);
                Assert.Equal(createResp.UploadId, listResp1.UploadId);
                Assert.Equal(StorageClass.Standard, listResp1.StorageClass);
                Assert.Equal(0, listResp1.PartNumberMarker);
                Assert.Equal(0, listResp1.NextPartNumberMarker);
                Assert.Equal(1000, listResp1.MaxParts);
                Assert.False(listResp1.IsTruncated);
                Assert.Equal(TestConstants.TestUsername, listResp1.Owner.Name);

                Assert.Empty(listResp1.Parts);

                UploadPartResponse uploadResp;

                byte[] file = new byte[5 * 1024];

                using (MemoryStream ms = new MemoryStream(file))
                    uploadResp = await MultipartClient.UploadPartAsync(bucket, objName, 1, createResp.UploadId, ms).ConfigureAwait(false);

                ListPartsResponse listResp2 = await MultipartClient.ListPartsAsync(bucket, objName, createResp.UploadId, req => req.EncodingType = EncodingType.Url).ConfigureAwait(false);

                Assert.Equal(bucket, listResp2.BucketName);
                Assert.Equal(WebUtility.UrlEncode(objName), listResp2.ObjectKey); //It should be encoded at this point
                Assert.Equal(createResp.UploadId, listResp2.UploadId);
                Assert.Equal(StorageClass.Standard, listResp2.StorageClass);
                Assert.Equal(0, listResp2.PartNumberMarker);
                Assert.Equal(1, listResp2.NextPartNumberMarker);
                Assert.Equal(1000, listResp2.MaxParts);
                Assert.False(listResp2.IsTruncated);
                Assert.Equal(TestConstants.TestUsername, listResp2.Owner.Name);

                S3Part part = Assert.Single(listResp2.Parts);

                Assert.Equal(1, part.PartNumber);
                Assert.Equal(DateTime.UtcNow, part.LastModified.DateTime, TimeSpan.FromSeconds(5));
                Assert.Equal("\"32ca18808933aa12e979375d07048a11\"", part.ETag);
                Assert.Equal(file.Length, part.Size);

                await MultipartClient.CompleteMultipartUploadAsync(bucket, objName, createResp.UploadId, new[] { uploadResp }).ConfigureAwait(false);

                ListPartsResponse listResp3 = await MultipartClient.ListPartsAsync(bucket, objName, createResp.UploadId).ConfigureAwait(false);
                Assert.False(listResp3.IsSuccess);
                Assert.Equal(404, listResp3.StatusCode);
            }).ConfigureAwait(false);
        }
        public void MarshalResponse(IConfig config, ListPartsResponse response, IDictionary <string, string> headers, Stream responseStream)
        {
            response.AbortsOn       = headers.GetHeaderDate(AmzHeaders.XAmzAbortDate, DateTimeFormat.Iso8601DateTimeExt);
            response.AbortRuleId    = headers.GetHeader(AmzHeaders.XAmzAbortRuleId);
            response.RequestCharged = headers.ContainsKey(AmzHeaders.XAmzRequestCharged);

            XmlSerializer s = new XmlSerializer(typeof(ListPartsResult));

            using (XmlTextReader r = new XmlTextReader(responseStream))
            {
                r.Namespaces = false;

                ListPartsResult listResult = (ListPartsResult)s.Deserialize(r);

                if (listResult.EncodingType != null)
                {
                    response.EncodingType = ValueHelper.ParseEnum <EncodingType>(listResult.EncodingType);
                }

                response.ObjectKey  = config.AutoUrlDecodeResponses && response.EncodingType == EncodingType.Url ? WebUtility.UrlDecode(listResult.Key) : listResult.Key;
                response.BucketName = listResult.Bucket;
                response.UploadId   = listResult.UploadId;

                if (listResult.StorageClass != null)
                {
                    response.StorageClass = ValueHelper.ParseEnum <StorageClass>(listResult.StorageClass);
                }

                response.PartNumberMarker     = listResult.PartNumberMarker;
                response.NextPartNumberMarker = listResult.NextPartNumberMarker;
                response.MaxParts             = listResult.MaxParts;
                response.IsTruncated          = listResult.IsTruncated;

                if (listResult.Owner != null)
                {
                    response.Owner      = new S3Identity();
                    response.Owner.Name = listResult.Owner.DisplayName;
                    response.Owner.Id   = listResult.Owner.Id;
                }

                if (listResult.Initiator != null)
                {
                    response.Initiator      = new S3Identity();
                    response.Initiator.Name = listResult.Initiator.DisplayName;
                    response.Initiator.Id   = listResult.Initiator.Id;
                }

                if (listResult.Parts != null)
                {
                    response.Parts = new List <S3Part>(listResult.Parts.Count);

                    foreach (Part part in listResult.Parts)
                    {
                        S3Part s3Part = new S3Part();
                        s3Part.ETag         = part.ETag;
                        s3Part.LastModified = part.LastModified;
                        s3Part.PartNumber   = part.PartNumber;
                        s3Part.Size         = part.Size;

                        response.Parts.Add(s3Part);
                    }
                }
                else
                {
                    response.Parts = Array.Empty <S3Part>();
                }
            }
        }
        public void MarshalResponse(ListPartsRequest request, ListPartsResponse response, IDictionary <string, string> headers, Stream responseStream)
        {
            XmlSerializer s = new XmlSerializer(typeof(ListPartsResult));

            using (XmlTextReader r = new XmlTextReader(responseStream))
            {
                r.Namespaces = false;

                ListPartsResult listResult = (ListPartsResult)s.Deserialize(r);
                response.Bucket   = listResult.Bucket;
                response.Key      = listResult.Key;
                response.UploadId = listResult.UploadId;

                if (listResult.StorageClass != null)
                {
                    response.StorageClass = EnumsNET.Enums.Parse <StorageClass>(listResult.StorageClass, EnumFormat.EnumMemberValue);
                }

                response.PartNumberMarker     = listResult.PartNumberMarker;
                response.NextPartNumberMarker = listResult.NextPartNumberMarker;
                response.MaxParts             = listResult.MaxParts;
                response.IsTruncated          = listResult.IsTruncated;

                if (listResult.EncodingType != null)
                {
                    response.EncodingType = EnumsNET.Enums.Parse <EncodingType>(listResult.EncodingType, EnumFormat.EnumMemberValue);
                }

                if (listResult.Owner != null)
                {
                    response.Owner      = new S3ObjectIdentity();
                    response.Owner.Name = listResult.Owner.DisplayName;
                    response.Owner.Id   = listResult.Owner.Id;
                }

                if (listResult.Initiator != null)
                {
                    response.Initiator      = new S3ObjectIdentity();
                    response.Initiator.Name = listResult.Initiator.DisplayName;
                    response.Initiator.Id   = listResult.Initiator.Id;
                }

                if (listResult.Part != null)
                {
                    response.Parts = new List <S3Part>(listResult.Part.Count);

                    foreach (Part part in listResult.Part)
                    {
                        S3Part s3Part = new S3Part();
                        s3Part.ETag         = part.ETag;
                        s3Part.LastModified = part.LastModified;
                        s3Part.PartNumber   = part.PartNumber;
                        s3Part.Size         = part.Size;

                        response.Parts.Add(s3Part);
                    }
                }
                else
                {
                    response.Parts = Array.Empty <S3Part>();
                }
            }
        }