Files
g.hnyhua.cn/COSXML/Model/CosRequest.cs

310 lines
9.5 KiB
C#
Raw Normal View History

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();
}
}
}
}