Files
g.hnyhua.cn/COSXML/Model/CosRequest.cs
2026-02-07 15:48:27 +08:00

310 lines
9.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();
}
}
}
}