private async Task <HttpResponseMessage> RequestV1(AbstractModel request, string actionName) { Dictionary <string, string> param = BuildParam(request, actionName); string endpoint = this.Endpoint; if (!string.IsNullOrEmpty(this.Profile.HttpProfile.Endpoint)) { endpoint = this.Profile.HttpProfile.Endpoint; } HttpConnection conn = new HttpConnection( $"{this.Profile.HttpProfile.Protocol }{endpoint}", this.Profile.HttpProfile.Timeout, this.Profile.HttpProfile.WebProxy, this.HttpClient); try { if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET) { return(await conn.GetRequestAsync(this.Path, param)); } else if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_POST) { return(await conn.PostRequestAsync(this.Path, param)); } return(null); } catch (Exception ex) { throw new TencentCloudSDKException($"The request with exception: {ex.Message }"); } }
private async Task <HttpResponseMessage> RequestV3(AbstractModel request, string actionName) { string canonicalQueryString = this.BuildCanonicalQueryString(request); string requestPayload = this.BuildRequestPayload(request); string contentType = this.BuildContentType(); Dictionary <string, string> headers = this.BuildHeaders(contentType, requestPayload, canonicalQueryString); headers.Add("X-TC-Action", actionName); string endpoint = headers["Host"]; HttpConnection conn = new HttpConnection( $"{this.Profile.HttpProfile.Protocol}{endpoint}", this.Profile.HttpProfile.Timeout, this.Profile.HttpProfile.WebProxy, this.HttpClient); try { if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET) { return(await conn.GetRequestAsync(this.Path, canonicalQueryString, headers)); } else if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_POST) { return(await conn.PostRequestAsync(this.Path, requestPayload, headers)); } return(null); } catch (Exception e) { throw new TencentCloudSDKException($"The request with exception: {e.Message}"); } }
protected string InternalRequestSync(AbstractModel request, string actionName) { Task <string> task = Task.Run(() => this.InternalRequest(request, actionName)); task.Wait(); return(task.Result); }
private async Task<IResponse> RequestV1(AbstractModel request, string actionName) { IResponse response = null; string endpoint = this.Endpoint; if (!string.IsNullOrEmpty(this.Profile.HttpProfile.Endpoint)) { endpoint = this.Profile.HttpProfile.Endpoint; } Dictionary<string, string> param = new Dictionary<string, string>(); request.ToMap(param, ""); // inplace change this.FormatRequestData(actionName, param); HttpConnection conn = new HttpConnection( $"{this.Profile.HttpProfile.Protocol }{endpoint}", this.Profile.HttpProfile.Timeout, this.Profile.HttpProfile.WebProxy); try { if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET) { response = await conn.GetRequest($"{this.Path}", param); } else if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_POST) { response = await conn.PostRequest(this.Path, param); } } catch(Exception ex) { throw new TencentCloudSDKException($"The request with exception: {ex.Message }"); } return response; }
private Dictionary <string, string> BuildParam(AbstractModel request, string actionName) { Dictionary <string, string> param = new Dictionary <string, string>(); request.ToMap(param, ""); // inplace change this.FormatRequestData(actionName, param); return(param); }
protected async Task <string> InternalRequest(AbstractModel request, string actionName) { if ((this.Profile.HttpProfile.ReqMethod != HttpProfile.REQ_GET) && (this.Profile.HttpProfile.ReqMethod != HttpProfile.REQ_POST)) { throw new TencentCloudSDKException("Method only support (GET, POST)"); } IResponse response = null; if (ClientProfile.SIGN_SHA1.Equals(this.Profile.SignMethod) || ClientProfile.SIGN_SHA256.Equals(this.Profile.SignMethod)) { response = await RequestV1(request, actionName); } else { response = await RequestV3(request, actionName); } if ((int)response.Status != HTTP_RSP_OK) { throw new TencentCloudSDKException(response.Status + await response.Message.Content.ReadAsStringAsync()); } string strResp = null; try { strResp = await response.AsString(); } catch (ApiException ex) { string responseText = await ex.Response.AsString(); throw new TencentCloudSDKException($"The API responded with HTTP {ex.Response.Status}: {responseText}"); } JsonResponseModel <JsonResponseErrModel> errResp = null; try { errResp = JsonConvert.DeserializeObject <JsonResponseModel <JsonResponseErrModel> >(strResp); } catch (JsonSerializationException e) { throw new TencentCloudSDKException(e.Message); } if (errResp.Response.Error != null) { throw new TencentCloudSDKException($"code:{errResp.Response.Error.Code} message:{errResp.Response.Error.Message} ", errResp.Response.RequestId); } return(strResp); }
private string BuildRequestPayload(AbstractModel request) { string httpRequestMethod = this.Profile.HttpProfile.ReqMethod; if (HttpProfile.REQ_GET.Equals(httpRequestMethod)) { return(""); } return(JsonConvert.SerializeObject(request, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); }
private string BuildCanonicalQueryString(AbstractModel request) { string httpRequestMethod = this.Profile.HttpProfile.ReqMethod; if (!HttpProfile.REQ_GET.Equals(httpRequestMethod)) { return(""); } Dictionary <string, string> param = new Dictionary <string, string>(); request.ToMap(param, ""); StringBuilder urlBuilder = new StringBuilder(); foreach (KeyValuePair <string, string> kvp in param) { urlBuilder.Append($"{WebUtility.UrlEncode(kvp.Key)}={WebUtility.UrlEncode(kvp.Value)}&"); } return(urlBuilder.ToString().TrimEnd('&')); }
private HttpWebResponse RequestV1Sync(AbstractModel request, string actionName) { HttpWebResponse response = null; Dictionary <string, string> param = BuildParam(request, actionName); HttpConnection conn = this.BuildConnection(); try { if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET) { response = conn.GetRequestSync(this.Path, param); } else if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_POST) { response = conn.PostRequestSync(this.Path, param); } } catch (Exception ex) { throw new TencentCloudSDKException($"The request with exception: {ex.Message }"); } return(response); }
private async Task <IResponse> RequestV3(AbstractModel request, string actionName) { string endpoint = this.Endpoint; if (!string.IsNullOrEmpty(this.Profile.HttpProfile.Endpoint)) { endpoint = this.Profile.HttpProfile.Endpoint; } string httpRequestMethod = this.Profile.HttpProfile.ReqMethod; string canonicalURI = "/"; string canonicalQueryString = ""; string requestPayload = ""; string contentType = "application/x-www-form-urlencoded"; if (HttpProfile.REQ_GET.Equals(httpRequestMethod)) { Dictionary <string, string> param = new Dictionary <string, string>(); request.ToMap(param, ""); StringBuilder urlBuilder = new StringBuilder(); foreach (KeyValuePair <string, string> kvp in param) { urlBuilder.Append($"{WebUtility.UrlEncode(kvp.Key)}={WebUtility.UrlEncode(kvp.Value)}&"); } canonicalQueryString = urlBuilder.ToString().TrimEnd('&'); } else { requestPayload = JsonConvert.SerializeObject(request, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); contentType = "application/json"; } // HttpContent->StringContent will add charset to utf-8 in content-type, // which leads to authentication failure in API... string canonicalHeaders = "content-type:" + contentType + "; charset=utf-8\nhost:" + endpoint + "\n"; string signedHeaders = "content-type;host"; string hashedRequestPayload = SignHelper.SHA256Hex(requestPayload); string canonicalRequest = httpRequestMethod + "\n" + canonicalURI + "\n" + canonicalQueryString + "\n" + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload; //Console.WriteLine(canonicalRequest); string algorithm = "TC3-HMAC-SHA256"; long timestamp = ToTimestamp() / 1000; string requestTimestamp = timestamp.ToString(); string date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(timestamp).ToString("yyyy-MM-dd"); string service = endpoint.Split('.')[0]; string credentialScope = date + "/" + service + "/" + "tc3_request"; string hashedCanonicalRequest = SignHelper.SHA256Hex(canonicalRequest); string stringToSign = algorithm + "\n" + requestTimestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest; //Console.WriteLine(stringToSign); byte[] tc3SecretKey = Encoding.UTF8.GetBytes("TC3" + Credential.SecretKey); byte[] secretDate = SignHelper.HmacSHA256(tc3SecretKey, Encoding.UTF8.GetBytes(date)); byte[] secretService = SignHelper.HmacSHA256(secretDate, Encoding.UTF8.GetBytes(service)); byte[] secretSigning = SignHelper.HmacSHA256(secretService, Encoding.UTF8.GetBytes("tc3_request")); byte[] signatureBytes = SignHelper.HmacSHA256(secretSigning, Encoding.UTF8.GetBytes(stringToSign)); string signature = BitConverter.ToString(signatureBytes).Replace("-", "").ToLower(); //Console.WriteLine(signature); string authorization = algorithm + " " + "Credential=" + Credential.SecretId + "/" + credentialScope + ", " + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature; //Console.WriteLine(authorization); Dictionary <string, string> headers = new Dictionary <string, string>(); headers.Add("Authorization", authorization); headers.Add("Host", endpoint); headers.Add("Content-Type", contentType); headers.Add("X-TC-Action", actionName); headers.Add("X-TC-Timestamp", requestTimestamp); headers.Add("X-TC-Version", this.ApiVersion); headers.Add("X-TC-Region", this.Region); headers.Add("X-TC-RequestClient", this.SdkVersion); if (!string.IsNullOrEmpty(this.Credential.Token)) { headers.Add("X-TC-Token", this.Credential.Token); } HttpConnection conn = new HttpConnection( $"{this.Profile.HttpProfile.Protocol }{endpoint}", this.Profile.HttpProfile.Timeout, this.Profile.HttpProfile.WebProxy); try { if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET) { return(await conn.GetRequest(this.Path, canonicalQueryString, headers)); } else { return(await conn.PostRequest(this.Path, requestPayload, headers)); } } catch (Exception e) { throw new TencentCloudSDKException($"The request with exception: {e.Message}"); } }
protected string InternalRequestSync(AbstractModel request, string actionName) { if ((this.Profile.HttpProfile.ReqMethod != HttpProfile.REQ_GET) && (this.Profile.HttpProfile.ReqMethod != HttpProfile.REQ_POST)) { throw new TencentCloudSDKException("Method only support (GET, POST)"); } HttpWebResponse response = null; if (ClientProfile.SIGN_SHA1.Equals(this.Profile.SignMethod) || ClientProfile.SIGN_SHA256.Equals(this.Profile.SignMethod)) { response = RequestV1Sync(request, actionName); } else { response = RequestV3Sync(request, actionName); } HttpStatusCode statusCode = response.StatusCode; if (statusCode != HttpStatusCode.OK) { Encoding encoding = Encoding.UTF8; using (Stream stream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) { string content = sr.ReadToEnd().ToString(); throw new TencentCloudSDKException(statusCode.ToString() + content); } } } string strResp = null; try { Encoding encoding = Encoding.UTF8; using (Stream stream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(response.GetResponseStream(), encoding)) { strResp = sr.ReadToEnd().ToString(); } } } catch (Exception ex) { string responseText = ex.Message; throw new TencentCloudSDKException($"The API responded with HTTP {responseText}"); } JsonResponseModel <JsonResponseErrModel> errResp = null; try { errResp = JsonConvert.DeserializeObject <JsonResponseModel <JsonResponseErrModel> >(strResp); } catch (JsonSerializationException e) { throw new TencentCloudSDKException(e.Message); } if (errResp.Response.Error != null) { throw new TencentCloudSDKException($"code:{errResp.Response.Error.Code} message:{errResp.Response.Error.Message} ", errResp.Response.RequestId); } return(strResp); }
protected async Task <string> InternalRequest(AbstractModel request, string actionName) { IResponse okRsp = null; string endpoint = this.Endpoint; if (!string.IsNullOrEmpty(this.Profile.HttpProfile.Endpoint)) { endpoint = this.Profile.HttpProfile.Endpoint; } Dictionary <string, string> param = new Dictionary <string, string>(); request.ToMap(param, ""); // inplace change this.FormatRequestData(actionName, param); using (HttpConnection conn = new HttpConnection($"{this.Profile.HttpProfile.Protocol }{endpoint}", this.Profile.HttpProfile.Timeout, this.Profile.HttpProfile.WebProxy)) { if ((this.Profile.HttpProfile.ReqMethod != HttpProfile.REQ_GET) && (this.Profile.HttpProfile.ReqMethod != HttpProfile.REQ_POST)) { throw new TencentCloudSDKException("Method only support (GET, POST)"); } try { if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_GET) { okRsp = await conn.GetRequest($"{this.Path}", param); } else if (this.Profile.HttpProfile.ReqMethod == HttpProfile.REQ_POST) { okRsp = await conn.PostRequest(this.Path, param); } } catch (Exception ex) { throw new TencentCloudSDKException($"The request with exception: {ex.Message }"); } } if ((int)okRsp.Status != HTTP_RSP_OK) { throw new TencentCloudSDKException(okRsp.Status + await okRsp.Message.Content.ReadAsStringAsync()); } string strResp = null; try { strResp = await okRsp.AsString(); } catch (ApiException ex) { string responseText = await ex.Response.AsString(); throw new TencentCloudSDKException($"The API responded with HTTP {ex.Response.Status}: {responseText}"); } JsonResponseModel <JsonResponseErrModel> errResp = null; try { errResp = JsonConvert.DeserializeObject <JsonResponseModel <JsonResponseErrModel> >(strResp); } catch (JsonSerializationException e) { throw new TencentCloudSDKException(e.Message); } if (errResp.Response.Error != null) { throw new TencentCloudSDKException($"code:{errResp.Response.Error.Code} message:{errResp.Response.Error.Message} ", errResp.Response.RequestId); } return(strResp); }