aliyun-net-credentials/Http/HttpResponse.cs (294 lines of code) (raw):
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Aliyun.Credentials.Exceptions;
using Aliyun.Credentials.Utils;
namespace Aliyun.Credentials.Http
{
public class HttpResponse : HttpRequest
{
// Default read timeout 10s
private const int DefaultReadTimeoutInMilliSeconds = 10000;
// Default connect timeout 5s
private const int DefaultConnectTimeoutInMilliSeconds = 5000;
private const int BufferLength = 1024;
public HttpResponse(string strUrl) : base(strUrl)
{
}
public int Status { get; set; }
public void SetContent(byte[] content, string encoding, FormatType? format)
{
Content = content;
Encoding = encoding;
ContentType = format;
}
private static void ParseHttpResponse(HttpResponse httpResponse, HttpWebResponse httpWebResponse)
{
httpResponse.Content = ReadContent(httpWebResponse);
httpResponse.Status = (int)httpWebResponse.StatusCode;
httpResponse.Headers = new Dictionary<string, string>();
httpResponse.Method = ParameterHelper.StringToMethodType(httpWebResponse.Method);
foreach (var key in httpWebResponse.Headers.AllKeys)
{
httpResponse.Headers.Add(key, httpWebResponse.Headers[key]);
}
var contentType = DictionaryUtil.Get(httpResponse.Headers, "Content-Type");
if (null == contentType) return;
httpResponse.Encoding = "UTF-8";
var split = contentType.Split(';');
httpResponse.ContentType = ParameterHelper.StingToFormatType(split[0].Trim());
if (split.Length <= 1 || !split[1].Contains("=")) return;
var codings = split[1].Split('=');
httpResponse.Encoding = codings[1].Trim().ToUpper();
}
private static async Task ParseHttpResponseAsync(HttpResponse httpResponse, HttpWebResponse httpWebResponse)
{
httpResponse.Content = await ReadContentAsync(httpWebResponse);
httpResponse.Status = (int)httpWebResponse.StatusCode;
httpResponse.Headers = new Dictionary<string, string>();
httpResponse.Method = ParameterHelper.StringToMethodType(httpWebResponse.Method);
foreach (var key in httpWebResponse.Headers.AllKeys)
{
httpResponse.Headers.Add(key, httpWebResponse.Headers[key]);
}
var contentType = DictionaryUtil.Get(httpResponse.Headers, "Content-Type");
if (null == contentType) return;
httpResponse.Encoding = "UTF-8";
var split = contentType.Split(';');
httpResponse.ContentType = ParameterHelper.StingToFormatType(split[0].Trim());
if (split.Length <= 1 || !split[1].Contains("=")) return;
var codings = split[1].Split('=');
httpResponse.Encoding = codings[1].Trim().ToUpper();
}
private static byte[] ReadContent(WebResponse rsp)
{
using (var ms = new MemoryStream())
using (var stream = rsp.GetResponseStream())
{
{
var buffer = new byte[BufferLength];
while (stream != null)
{
var length = stream.Read(buffer, 0, BufferLength);
if (length == 0)
{
break;
}
ms.Write(buffer, 0, length);
}
ms.Seek(0, SeekOrigin.Begin);
var bytes = new byte[ms.Length];
ms.Read(bytes, 0, bytes.Length);
return bytes;
}
}
}
private static async Task<byte[]> ReadContentAsync(WebResponse rsp)
{
using (var ms = new MemoryStream())
using (var stream = rsp.GetResponseStream())
{
{
var buffer = new byte[BufferLength];
while (stream != null)
{
var length = await stream.ReadAsync(buffer, 0, BufferLength);
if (length == 0)
{
break;
}
await ms.WriteAsync(buffer, 0, length);
}
ms.Seek(0, SeekOrigin.Begin);
var bytes = new byte[ms.Length];
await ms.ReadAsync(bytes, 0, bytes.Length);
return bytes;
}
}
}
public static HttpResponse GetResponse(HttpRequest request, int? timeout = null)
{
CheckHttpRequest(request);
var httpWebRequest = GetWebRequest(request);
if (timeout != null)
{
httpWebRequest.Timeout = (int)timeout;
}
HttpWebResponse httpWebResponse;
var httpResponse = new HttpResponse(httpWebRequest.RequestUri.AbsoluteUri);
try
{
using (httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
ParseHttpResponse(httpResponse, httpWebResponse);
return httpResponse;
}
}
catch (WebException ex)
{
if (ex.Response != null)
{
httpWebResponse = (HttpWebResponse)ex.Response;
ParseHttpResponse(httpResponse, httpWebResponse);
return httpResponse;
}
else
{
throw new CredentialException("Exception",
string.Format("The request url is {0} {1}",
httpWebRequest.RequestUri == null ? "empty" : httpWebRequest.RequestUri.Host, ex));
}
}
catch (Exception ex)
{
throw new CredentialException("Exception",
string.Format("The request url is {0} {1}",
httpWebRequest.RequestUri == null ? "empty" : httpWebRequest.RequestUri.Host, ex));
}
}
public static async Task<HttpResponse> GetResponseAsync(HttpRequest request, int? timeout = null)
{
CheckHttpRequest(request);
var httpWebRequest = await GetWebRequestAsync(request);
if (timeout != null)
{
httpWebRequest.Timeout = (int)timeout;
}
HttpWebResponse httpWebResponse;
var httpResponse = new HttpResponse(httpWebRequest.RequestUri.AbsoluteUri);
try
{
using (httpWebResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync())
{
await ParseHttpResponseAsync(httpResponse, httpWebResponse);
return httpResponse;
}
}
catch (WebException ex)
{
if (ex.Response != null)
{
httpWebResponse = (HttpWebResponse)ex.Response;
ParseHttpResponse(httpResponse, httpWebResponse);
return httpResponse;
}
else
{
throw new CredentialException("Exception",
string.Format("The request url is {0} {1}",
httpWebRequest.RequestUri == null ? "empty" : httpWebRequest.RequestUri.Host, ex));
}
}
catch (Exception ex)
{
throw new CredentialException("Exception",
string.Format("The request url is {0} {1}",
httpWebRequest.RequestUri == null ? "empty" : httpWebRequest.RequestUri.Host, ex));
}
}
public static HttpWebRequest GetWebRequest(HttpRequest request)
{
var uri = new Uri(request.Url);
var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Method = request.Method.ToString();
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout =
request.ConnectTimeout > 0 ? request.ConnectTimeout : DefaultConnectTimeoutInMilliSeconds;
httpWebRequest.ReadWriteTimeout =
request.ReadTimeout > 0 ? request.ReadTimeout : DefaultReadTimeoutInMilliSeconds;
if (DictionaryUtil.Get(request.Headers, "Accept") != null)
{
httpWebRequest.Accept = DictionaryUtil.Pop(request.Headers, "Accept");
}
if (DictionaryUtil.Get(request.Headers, "Date") != null)
{
var headerDate = DictionaryUtil.Pop(request.Headers, "Date");
httpWebRequest.Date = Convert.ToDateTime(headerDate);
}
foreach (var header in request.Headers)
{
// deal with restricted headers on .NET Framework
if (header.Key.Equals("Content-Length"))
{
httpWebRequest.ContentLength = long.Parse(header.Value);
continue;
}
if (header.Key.Equals("Content-Type"))
{
httpWebRequest.ContentType = header.Value;
continue;
}
if (header.Key.Equals("User-Agent"))
{
httpWebRequest.UserAgent = header.Value;
continue;
}
httpWebRequest.Headers.Add(header.Key, header.Value);
}
if ((request.Method != MethodType.POST && request.Method != MethodType.PUT) || request.Content == null)
return httpWebRequest;
using (var stream = httpWebRequest.GetRequestStream())
{
stream.Write(request.Content, 0, request.Content.Length);
}
return httpWebRequest;
}
public static async Task<HttpWebRequest> GetWebRequestAsync(HttpRequest request)
{
var uri = new Uri(request.Url);
var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Method = request.Method.ToString();
httpWebRequest.KeepAlive = true;
httpWebRequest.Timeout =
request.ConnectTimeout > 0 ? request.ConnectTimeout : DefaultConnectTimeoutInMilliSeconds;
httpWebRequest.ReadWriteTimeout =
request.ReadTimeout > 0 ? request.ReadTimeout : DefaultReadTimeoutInMilliSeconds;
if (DictionaryUtil.Get(request.Headers, "Accept") != null)
{
httpWebRequest.Accept = DictionaryUtil.Pop(request.Headers, "Accept");
}
if (DictionaryUtil.Get(request.Headers, "Date") != null)
{
var headerDate = DictionaryUtil.Pop(request.Headers, "Date");
httpWebRequest.Date = Convert.ToDateTime(headerDate);
}
foreach (var header in request.Headers)
{
// deal with restricted headers on .NET Framework
if (header.Key.Equals("Content-Length"))
{
httpWebRequest.ContentLength = long.Parse(header.Value);
continue;
}
if (header.Key.Equals("Content-Type"))
{
httpWebRequest.ContentType = header.Value;
continue;
}
if (header.Key.Equals("User-Agent"))
{
httpWebRequest.UserAgent = header.Value;
continue;
}
httpWebRequest.Headers.Add(header.Key, header.Value);
}
if ((request.Method != MethodType.POST && request.Method != MethodType.PUT) || request.Content == null)
return httpWebRequest;
using (var stream = await httpWebRequest.GetRequestStreamAsync())
{
await stream.WriteAsync(request.Content, 0, request.Content.Length);
}
return httpWebRequest;
}
private static void CheckHttpRequest(HttpRequest request)
{
var strUrl = request.Url;
if (null == strUrl)
{
throw new InvalidDataException("URL is null for HttpRequest.");
}
if (null == request.Method)
{
throw new InvalidDataException("Method is null for HttpRequest.");
}
}
}
}