/*
* Copyright (C) Alibaba Cloud Computing
* All rights reserved.
*
* 版权所有 (C)阿里云计算有限公司
*/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using Aliyun.OSS.Util;
namespace Aliyun.OSS
{
///
/// 指定从OSS下载Object的请求参数。
///
public class GetObjectRequest
{
private readonly IList _matchingETagConstraints = new List();
private readonly IList _nonmatchingEtagConstraints = new List();
private readonly ResponseHeaderOverrides _responseHeaders = new ResponseHeaderOverrides();
///
/// 获取或设置的名称。
///
public string BucketName { get; private set; }
///
/// 获取或设置要下载的Key。
///
public string Key { get; private set; }
///
/// 获取表示请求应当返回内容的字节范围。
///
///
/// 调用方法进行设置,如果没有设置,则返回null。
///
public long[] Range { get; private set; }
///
/// 获取或设置“If-Unmodified-Since”参数。
///
///
/// 该参数表示:如果传入参数中的时间等于或者晚于文件实际修改时间,则传送文件;
/// 如果早于实际修改时间,则返回错误。
///
public DateTime? UnmodifiedSinceConstraint { get; set; }
///
/// 获取或设置“If-Modified-Since”参数。
///
///
/// 该参数表示:如果指定的时间早于实际修改时间,则正常传送文件,并返回 200 OK;
/// 如果参数中的时间和实际修改时间一样或者更晚,会返回错误。
///
public DateTime? ModifiedSinceConstraint { get; set; }
///
/// 获取一个列表表示:如果传入期望的ETag和的ETag匹配,则正常的发送文件。
/// 如果不符合,返回错误。
/// 对应“If-Match”参数,
///
public IList MatchingETagConstraints
{
get { return _matchingETagConstraints; }
}
///
/// 获取一个列表表示:如果传入期望的ETag和的ETag不匹配,则正常的发送文件。
/// 如果符合,返回错误。
/// 对应“If-None-Match”参数,
///
public IList NonmatchingETagConstraints
{
get { return _nonmatchingEtagConstraints; }
}
///
/// 获取的返回请求头重载实例。
///
public ResponseHeaderOverrides ResponseHeaders
{
get { return _responseHeaders; }
}
///
/// 构造一个新的实例。
///
/// 所在的名称。
/// 的。
public GetObjectRequest(string bucketName, string key)
{
BucketName = bucketName;
Key = key;
}
///
/// 设置一个值表示请求应当返回Object内容的字节范围(可选)。
///
///
/// 范围的起始值。
///
/// 当值大于或等于0时,表示起始的字节位置。
/// 当值为-1时,表示不设置起始的字节位置,此时end参数不能-1,
/// 例如end为100,Range请求头的值为bytes=-100,表示获取最后100个字节。
///
///
///
/// 范围的结束值,应当小于内容的字节数。(最大为内容的字节数-1)
///
/// 当值小于或等于0时,表示结束的字节位或最后的字节数。
/// 当值为-1时,表示不设置结束的字节位置,此时start参数不能为-1,
/// 例如start为99,Range请求头的值为bytes=99-,表示获取第100个字节及
/// 以后的所有内容。
///
///
public void SetRange(long start, long end)
{
Range = new[] { start, end };
}
///
/// 添加Header值
///
/// 添加完Header之后的最终Header
internal void Populate(IDictionary headers)
{
if (Range != null && (Range[0] >= 0 || Range[1] >= 0))
{
var rangeHeaderValue = new StringBuilder();
rangeHeaderValue.Append("bytes=");
if (Range[0] >= 0)
rangeHeaderValue.Append(Range[0].ToString(CultureInfo.InvariantCulture));
rangeHeaderValue.Append("-");
if (Range[1] >= 0)
rangeHeaderValue.Append(Range[1].ToString(CultureInfo.InvariantCulture));
headers.Add(HttpHeaders.Range, rangeHeaderValue.ToString());
}
if (ModifiedSinceConstraint != null)
{
headers.Add(OssHeaders.GetObjectIfModifiedSince,
DateUtils.FormatRfc822Date(ModifiedSinceConstraint.Value));
}
if (UnmodifiedSinceConstraint != null)
{
headers.Add(OssHeaders.GetObjectIfUnmodifiedSince,
DateUtils.FormatRfc822Date(UnmodifiedSinceConstraint.Value));
}
if (_matchingETagConstraints.Count > 0)
{
headers.Add(OssHeaders.GetObjectIfMatch,
OssUtils.JoinETag(_matchingETagConstraints));
}
if (_nonmatchingEtagConstraints.Count > 0)
{
headers.Add(OssHeaders.GetObjectIfNoneMatch,
OssUtils.JoinETag(_nonmatchingEtagConstraints));
}
}
}
}