sdk/Transform/GetObjectResponseDeserializer.cs (66 lines of code) (raw):
/*
* Copyright (C) Alibaba Cloud Computing
* All rights reserved.
*
*/
using System;
using Aliyun.OSS.Common.Communication;
using Aliyun.OSS.Common.Internal;
using Aliyun.OSS.Util;
namespace Aliyun.OSS.Transform
{
internal class GetObjectResponseDeserializer : ResponseDeserializer<OssObject, OssObject>
{
private readonly GetObjectRequest _getObjectRequest;
private readonly IServiceClient _serviceClient;
public GetObjectResponseDeserializer(GetObjectRequest getObjectRequest, IServiceClient serviceClient)
: base(null)
{
_getObjectRequest = getObjectRequest;
_serviceClient = serviceClient;
}
public override OssObject Deserialize(ServiceResponse xmlStream)
{
OssObject ossObject = new OssObject(_getObjectRequest.Key)
{
BucketName = _getObjectRequest.BucketName,
ResponseStream = xmlStream.Content,
Metadata = DeserializerFactory.GetFactory()
.CreateGetObjectMetadataResultDeserializer().Deserialize(xmlStream)
};
DeserializeGeneric(xmlStream, ossObject);
var conf = OssUtils.GetClientConfiguration(_serviceClient);
var originalStream = ossObject.ResponseStream;
var streamLength = ossObject.ContentLength;
// setup progress
var callback = _getObjectRequest.StreamTransferProgress;
if (callback != null)
{
originalStream = OssUtils.SetupProgressListeners(originalStream, streamLength, conf.ProgressUpdateInterval, _serviceClient, callback);
ossObject.ResponseStream = originalStream;
}
// wrap response stream in MD5Stream
if (conf.EnalbeMD5Check)
{
byte[] expectedHashDigest = null;
if (xmlStream.Headers.ContainsKey(HttpHeaders.ContentMd5))
{
var md5OfResponse = xmlStream.Headers[HttpHeaders.ContentMd5];
expectedHashDigest = Convert.FromBase64String(md5OfResponse);
}
var hashStream = new MD5Stream(originalStream, expectedHashDigest, streamLength);
ossObject.ResponseStream = hashStream;
}
else if (conf.EnableCrcCheck && _getObjectRequest.Range == null && string.IsNullOrEmpty(_getObjectRequest.Process))
{
byte[] expectedHashDigest = null;
if (xmlStream.Headers.ContainsKey(HttpHeaders.HashCrc64Ecma))
{
var crcString = xmlStream.Headers[HttpHeaders.HashCrc64Ecma];
ulong crcVal;
if (ulong.TryParse(crcString, out crcVal))
{
expectedHashDigest = BitConverter.GetBytes(crcVal);
var hashStream = new Crc64Stream(originalStream, expectedHashDigest, streamLength);
ossObject.ResponseStream = hashStream;
}
}
}
return ossObject;
}
}
}