/CodeSharingSample/RealWorldStocks.Core/Http/HttpClient.cs

http://realworldstocks.codeplex.com · C# · 144 lines · 114 code · 24 blank · 6 comment · 10 complexity · a6c952ced06a73658a6a6f71f354ea38 MD5 · raw file

  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using RealWorldStocks.Core.Logging;
  7. namespace RealWorldStocks.Core.Http
  8. {
  9. public class HttpClient
  10. {
  11. /// <summary>
  12. /// Gets or sets the number of milliseconds to wait before the request times out.
  13. /// </summary>
  14. public TimeSpan Timeout { get; set; }
  15. /// <summary>
  16. /// Gets the headers which should be sent with each request.
  17. /// </summary>
  18. public WebHeaderCollection DefaultRequestHeaders { get; private set; }
  19. public HttpClient()
  20. {
  21. DefaultRequestHeaders = new WebHeaderCollection();
  22. DefaultRequestHeaders[HttpRequestHeader.AcceptEncoding] = "gzip";
  23. }
  24. public Task<HttpResponseMessage> GetAsync(string requestUri)
  25. {
  26. return GetAsync(new Uri(requestUri));
  27. }
  28. public Task<HttpResponseMessage> GetAsync(Uri requestUri)
  29. {
  30. return ExecuteRequest(HttpVerbs.GET, requestUri);
  31. }
  32. public Task<HttpResponseMessage> GetAsync(string requestUri, CancellationToken cancellationToken)
  33. {
  34. return GetAsync(requestUri);
  35. }
  36. public Task<HttpResponseMessage> GetAsync(Uri requestUri, CancellationToken cancellationToken)
  37. {
  38. return GetAsync(requestUri);
  39. }
  40. public Task<HttpResponseMessage> PostAsync(Uri requestUri, HttpContent content, CancellationToken cancellationToken)
  41. {
  42. return PostAsync(requestUri, content);
  43. }
  44. public Task<HttpResponseMessage> PostAsync(string requestUri, HttpContent content, CancellationToken cancellationToken)
  45. {
  46. return PostAsync(requestUri, content);
  47. }
  48. public Task<HttpResponseMessage> PostAsync(string requestUri, HttpContent content)
  49. {
  50. return PostAsync(new Uri(requestUri), content);
  51. }
  52. public Task<HttpResponseMessage> PostAsync(Uri requestUri, HttpContent content)
  53. {
  54. return ExecuteRequest(HttpVerbs.POST, requestUri, content);
  55. }
  56. private async Task<HttpResponseMessage> ExecuteRequest(HttpVerbs method, Uri requestUri, HttpContent content = null)
  57. {
  58. var request = WebRequest.CreateHttp(requestUri);
  59. var httpResponseMessage = new HttpResponseMessage();
  60. request.Headers = DefaultRequestHeaders;
  61. request.Method = method.ToString();
  62. request.Accept = "*/*";
  63. httpResponseMessage.Request = request;
  64. Logger.LogWebRequest(request);
  65. if (content != null) Logger.LogVerbose(content.ToString());
  66. try
  67. {
  68. if (method == HttpVerbs.POST)
  69. {
  70. request.ContentType = content.ContentType;
  71. var requestStreamTask = Task<Stream>.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null);
  72. using (Stream stream = await requestStreamTask.ConfigureAwait(false))
  73. {
  74. content.WriteToStream(stream);
  75. }
  76. }
  77. var responseTask = Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null);
  78. using (var response = await responseTask.ConfigureAwait(false) as HttpWebResponse)
  79. {
  80. httpResponseMessage.SetResponseData(response);
  81. Logger.LogWebResponse(response);
  82. }
  83. }
  84. catch (WebException we)
  85. {
  86. var response = (HttpWebResponse)we.Response;
  87. if (response != null)
  88. httpResponseMessage.SetResponseData(response);
  89. Logger.Log(we);
  90. }
  91. catch (Exception e)
  92. {
  93. Logger.Log(e);
  94. }
  95. return httpResponseMessage;
  96. }
  97. }
  98. public static class HttpWebResponseExtensions
  99. {
  100. public static string ReadAsString(this HttpWebResponse response)
  101. {
  102. string content;
  103. using (var responseStream = response.GetResponseStream())
  104. {
  105. if (responseStream == null)
  106. return null;
  107. if (response.Headers["Content-Encoding"] != null &&
  108. response.Headers["Content-Encoding"].Contains("gzip"))
  109. {
  110. content = PlatformAdapter.Current.ReadCompressedResponseStream(response);
  111. }
  112. else
  113. {
  114. content = new StreamReader(responseStream).ReadToEnd();
  115. }
  116. }
  117. return content;
  118. }
  119. }
  120. }