310 lines
9.5 KiB
C#
310 lines
9.5 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
|
|||
|
|
using System.Text;
|
|||
|
|
using COSXML.Common;
|
|||
|
|
using COSXML.Network;
|
|||
|
|
using COSXML.Log;
|
|||
|
|
using COSXML.Auth;
|
|||
|
|
using COSXML.Utils;
|
|||
|
|
/**
|
|||
|
|
* Copyright (c) 2018 Tencent Cloud. All rights reserved.
|
|||
|
|
* 11/2/2018 1:05:09 PM
|
|||
|
|
* bradyxiao
|
|||
|
|
*/
|
|||
|
|
namespace COSXML.Model
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* cos request base class, all cos operator must be extended this.
|
|||
|
|
*
|
|||
|
|
* request method | request path | query parameters
|
|||
|
|
* request headers
|
|||
|
|
* request body
|
|||
|
|
*
|
|||
|
|
* special:
|
|||
|
|
* cos sign;
|
|||
|
|
*/
|
|||
|
|
public abstract class CosRequest
|
|||
|
|
{
|
|||
|
|
private static string TAG = typeof(CosRequest).FullName;
|
|||
|
|
|
|||
|
|
protected Request realRequest;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// isHttps = true, https 请求; isHttps = false, http 请求; default isHttps = false.
|
|||
|
|
/// </summary>
|
|||
|
|
protected bool? isHttps = null;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// cos api 请求对应的 http method.
|
|||
|
|
/// </summary>
|
|||
|
|
protected string method = CosRequestMethod.GET;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// http 请求url中 path 部分.
|
|||
|
|
/// </summary>
|
|||
|
|
protected string path;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// http 请求url中 query 部分.
|
|||
|
|
/// </summary>
|
|||
|
|
protected Dictionary<string, string> queryParameters = new Dictionary<string,string>();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// http 请求 header 部分.
|
|||
|
|
/// </summary>
|
|||
|
|
protected Dictionary<string, string> headers = new Dictionary<string,string>();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// cos 服务的 appid.
|
|||
|
|
/// </summary>
|
|||
|
|
protected string appid;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// cos 服务签名的签名源部分.
|
|||
|
|
/// </summary>
|
|||
|
|
protected CosXmlSignSourceProvider cosXmlSignSourceProvider = new CosXmlSignSourceProvider();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// needMD5 = true, 请求中带上 Content-Md5; needMd5 = false, 请求中不带 Content-Md5; defalut needMd5 = false.
|
|||
|
|
/// </summary>
|
|||
|
|
protected bool needMD5 = true;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 请求预签名URL
|
|||
|
|
/// </summary>
|
|||
|
|
protected string requestUrlWithSign = null;
|
|||
|
|
|
|||
|
|
public CosXmlConfig serviceConfig {get; set;}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// http or https for cos request.
|
|||
|
|
/// </summary>
|
|||
|
|
public bool? IsHttps
|
|||
|
|
{
|
|||
|
|
get { return isHttps; }
|
|||
|
|
set { isHttps = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// http method
|
|||
|
|
/// </summary>
|
|||
|
|
public string Method
|
|||
|
|
{
|
|||
|
|
get { return method; }
|
|||
|
|
private set { }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// path of http url.
|
|||
|
|
/// </summary>
|
|||
|
|
public string RequestPath
|
|||
|
|
{
|
|||
|
|
get { return path; }
|
|||
|
|
private set { }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// query of http url.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public virtual Dictionary<string, string> GetRequestParamters()
|
|||
|
|
{
|
|||
|
|
return queryParameters;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// http request header
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public virtual Dictionary<string, string> GetRequestHeaders()
|
|||
|
|
{
|
|||
|
|
return headers;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// add query parameter for cos request, and cover the current value if it exists with the key.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
/// <param name="value"></param>
|
|||
|
|
public void SetQueryParameter(string key, string value)
|
|||
|
|
{
|
|||
|
|
SetQueryParameter(key, value, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// url 部分都统一 url encode
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
/// <param name="value"></param>
|
|||
|
|
/// <param name="isNeedUrlEncode"></param>
|
|||
|
|
public void SetQueryParameter(string key, string value, bool isNeedUrlEncode)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (value == null) value = "";
|
|||
|
|
if (isNeedUrlEncode)
|
|||
|
|
{
|
|||
|
|
value = URLEncodeUtils.Encode(value);
|
|||
|
|
}
|
|||
|
|
queryParameters.Add(key, value);
|
|||
|
|
}
|
|||
|
|
catch (ArgumentNullException)
|
|||
|
|
{
|
|||
|
|
QLog.D(TAG, "SetQueryParameter: key ==null");
|
|||
|
|
}
|
|||
|
|
catch (ArgumentException)
|
|||
|
|
{
|
|||
|
|
queryParameters[key] = value; // cover the current value
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// add header for cos request, and cover the current value, if it exists with the key.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"> header: key </param>
|
|||
|
|
/// <param name="value"> header: value</param>
|
|||
|
|
public void SetRequestHeader(string key, string value)
|
|||
|
|
{
|
|||
|
|
SetRequestHeader(key, value, false);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// header 默认不 encode
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key">不能为null 即不包含空格,即 位于(\u0020, \u007F),超过这个范围,urlencode</param>
|
|||
|
|
/// <param name="value">可以为null,为空,且位于(\u001f,\u007F) 和 '\t',超过这个范围,urlencode</param>
|
|||
|
|
/// <param name="isNeedUrlEncode"></param>
|
|||
|
|
public void SetRequestHeader(string key, string value, bool isNeedUrlEncode)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (value == null) value = "";
|
|||
|
|
if (isNeedUrlEncode)
|
|||
|
|
{
|
|||
|
|
value = URLEncodeUtils.Encode(value);
|
|||
|
|
}
|
|||
|
|
headers.Add(key, value);
|
|||
|
|
}
|
|||
|
|
catch (ArgumentNullException)
|
|||
|
|
{
|
|||
|
|
QLog.D(TAG, "SetRequestHeader: key ==null");
|
|||
|
|
}
|
|||
|
|
catch (ArgumentException)
|
|||
|
|
{
|
|||
|
|
headers[key] = value; // cover the current value
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// set appid for cos.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="appid"> cos appid </param>
|
|||
|
|
public string APPID
|
|||
|
|
{
|
|||
|
|
get { return this.appid; }
|
|||
|
|
set { this.appid = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 是否带上content-md5
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsNeedMD5
|
|||
|
|
{
|
|||
|
|
get { return needMD5; }
|
|||
|
|
set { needMD5 = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// return the host for cos request
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>host(string)</returns>
|
|||
|
|
public abstract string GetCOSHost();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// return the host for cos request
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>host(string)</returns>
|
|||
|
|
public abstract string GetHost();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// return the body for cos request. such as upload file.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns> <see cref="COSXML.Network.RequestBody"/></returns>
|
|||
|
|
public abstract RequestBody GetRequestBody();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// check parameter for cos.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <exception cref="COSXML.CosException.CosClientException"></exception>
|
|||
|
|
public abstract void CheckParameters();
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置签名的有效期: [signStartTimeSecond, signStartTimeSecond + durationSecond]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="signStartTimeSecond"></param>
|
|||
|
|
/// <param name="durationSecond"></param>
|
|||
|
|
public virtual void SetSign(long signStartTimeSecond, long durationSecond)
|
|||
|
|
{
|
|||
|
|
if (cosXmlSignSourceProvider == null) cosXmlSignSourceProvider = new CosXmlSignSourceProvider();
|
|||
|
|
cosXmlSignSourceProvider.SetSignTime(signStartTimeSecond, durationSecond);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 计算签名时,带上头部header 和查询参数 query验证.
|
|||
|
|
/// 设置签名的有效期: [signStartTimeSecond, signStartTimeSecond + durationSecond]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="signStartTimeSecond"></param>
|
|||
|
|
/// <param name="durationSecond"></param>
|
|||
|
|
/// <param name="headerKeys"></param>
|
|||
|
|
/// <param name="queryParameterKeys"></param>
|
|||
|
|
public virtual void SetSign(long signStartTimeSecond, long durationSecond, List<string> headerKeys, List<string> queryParameterKeys)
|
|||
|
|
{
|
|||
|
|
if (cosXmlSignSourceProvider == null) cosXmlSignSourceProvider = new CosXmlSignSourceProvider();
|
|||
|
|
cosXmlSignSourceProvider.SetSignTime(signStartTimeSecond, durationSecond);
|
|||
|
|
cosXmlSignSourceProvider.AddHeaderKeys(headerKeys);
|
|||
|
|
cosXmlSignSourceProvider.AddParameterKeys(queryParameterKeys);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 直接设置签名串.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sign"></param>
|
|||
|
|
public virtual void SetSign(string sign)
|
|||
|
|
{
|
|||
|
|
SetRequestHeader(CosRequestHeaderKey.AUTHORIZAIION, sign);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 返回签名数据源
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public virtual CosXmlSignSourceProvider GetSignSourceProvider()
|
|||
|
|
{
|
|||
|
|
return cosXmlSignSourceProvider;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置预签名URL
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="requestSignURL"></param>
|
|||
|
|
public string RequestURLWithSign
|
|||
|
|
{
|
|||
|
|
get { return requestUrlWithSign; }
|
|||
|
|
set { requestUrlWithSign = value; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void BindRequest(Request request)
|
|||
|
|
{
|
|||
|
|
this.realRequest = request;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Cancel()
|
|||
|
|
{
|
|||
|
|
if (realRequest != null)
|
|||
|
|
{
|
|||
|
|
realRequest.Cancel();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|