HttpMessages.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. using System;
  2. using System.Globalization;
  3. using System.Text;
  4. using System.Threading.Tasks;
  5. using FastReport.Auth;
  6. using FastReport.Cloud.FastReport.Models;
  7. using System.Net;
  8. using FastReport.Utils.Json.Serialization;
  9. using System.IO;
  10. using System.Net.Security;
  11. namespace FastReport.Cloud.FastReport
  12. {
  13. internal abstract class HttpMessages
  14. {
  15. private readonly AuthService _authService;
  16. internal static IdnMapping Idn { get; } = new IdnMapping();
  17. static HttpMessages()
  18. {
  19. #if !COREWIN
  20. ServicePointManager.Expect100Continue = true;
  21. ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
  22. ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) =>
  23. {
  24. return (sslPolicyErrors & SslPolicyErrors.RemoteCertificateNotAvailable) != SslPolicyErrors.RemoteCertificateNotAvailable;
  25. };
  26. #endif
  27. }
  28. private void AddAuthenticationHeader(WebHeaderCollection headers)
  29. {
  30. string headerValue;
  31. var user = _authService.User;
  32. if (!string.IsNullOrEmpty(user.ApiKey))
  33. {
  34. headerValue = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes("apikey:" + user.ApiKey));
  35. }
  36. else if (!string.IsNullOrEmpty(user.Token))
  37. {
  38. headerValue = "Bearer " + user.Token;
  39. }
  40. else
  41. throw new Exception("Auth not found");
  42. headers.Add("Authorization", headerValue);
  43. }
  44. protected HttpWebRequest GetHttpWebRequest(string url, string method = HttpMethod.Get,
  45. string accept = "application/json")
  46. {
  47. var host = FRCloudOptions.Instance.BackendHost;
  48. var uri = new UriBuilder();
  49. if (host.StartsWith("http://"))
  50. {
  51. uri.Scheme = "http://";
  52. uri.Host = host.Substring(7).Trim('/');
  53. }
  54. else if (host.StartsWith("https://"))
  55. {
  56. uri.Scheme = "https://";
  57. uri.Host = host.Substring(8).Trim('/');
  58. }
  59. else
  60. {
  61. uri.Host = host.Trim('/');
  62. }
  63. uri.Host = Idn.GetAscii(uri.Host);
  64. var splittedUrl = url.Split('?');
  65. uri.Path = splittedUrl[0];
  66. uri.Query = splittedUrl.Length == 2 ? splittedUrl[1] : "";
  67. #if COREWIN || MONO // .NET 4.5 or greater
  68. HttpWebRequest request = WebRequest.CreateHttp(uri.ToString());
  69. #else
  70. HttpWebRequest request = (HttpWebRequest)WebRequest.Create((uri.ToString()));
  71. #endif
  72. #if DEBUG && (MONO || COREWIN) // doesn`t supported in .NET 4.0
  73. request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
  74. #endif
  75. //request.Host = HOST;
  76. request.Method = method;
  77. //RequestUtils.SetProxySettings(request, ProxySettings);
  78. request.Accept = accept;
  79. request.Timeout = 5000;
  80. AddAuthenticationHeader(request.Headers);
  81. return request;
  82. }
  83. protected HttpWebRequest GetHttpWebRequestContent<TContent>(string url, TContent content,
  84. string method = HttpMethod.Post,
  85. string contentType = "application/json",
  86. string accept = "application/json")
  87. {
  88. HttpWebRequest request = GetHttpWebRequest(url, method, accept);
  89. request.ContentType = contentType;
  90. using (Stream requestStream = request.GetRequestStream())
  91. {
  92. byte[] bytes = JsonConverter.SerializeToBytes(content);
  93. requestStream.Write(bytes, 0, bytes.Length);
  94. }
  95. return request;
  96. }
  97. #if ASYNC
  98. protected async Task<HttpWebRequest> GetHttpWebRequestContentAsync<TContent>(string url, TContent content,
  99. string method = HttpMethod.Post,
  100. string contentType = "application/json",
  101. string accept = "application/json")
  102. {
  103. HttpWebRequest request = GetHttpWebRequest(url, method, accept);
  104. request.ContentType = contentType;
  105. using (Stream requestStream = request.GetRequestStream())
  106. {
  107. byte[] bytes = JsonConverter.SerializeToBytes(content);
  108. await requestStream.WriteAsync(bytes, 0, bytes.Length);
  109. }
  110. return request;
  111. }
  112. #endif
  113. protected static void Send(HttpWebRequest request)
  114. {
  115. #if !COREWIN
  116. request.Timeout = 10000;
  117. #endif
  118. using (var response = (HttpWebResponse)request.GetResponse())
  119. {
  120. var statusCode = response.StatusCode;
  121. if (statusCode == HttpStatusCode.OK
  122. || statusCode == HttpStatusCode.NoContent)
  123. {
  124. return;
  125. }
  126. else
  127. {
  128. throw new Exception($"Status code is {statusCode}");
  129. }
  130. }
  131. //}
  132. //catch
  133. //{
  134. //}
  135. }
  136. protected static TOut Send<TOut>(HttpWebRequest request)
  137. {
  138. #if !COREWIN
  139. request.Timeout = 10000;
  140. #endif
  141. using (var response = (HttpWebResponse)request.GetResponse())
  142. {
  143. if (response.StatusCode == HttpStatusCode.OK)
  144. {
  145. using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet)))
  146. {
  147. var json = reader.ReadToEnd();
  148. TOut result = JsonConverter.Deserialize<TOut>(json);
  149. return result;
  150. }
  151. }
  152. else
  153. {
  154. throw new Exception($"Status code is {response.StatusCode}");
  155. }
  156. }
  157. //}
  158. //catch
  159. //{
  160. //}
  161. }
  162. protected static FileResponse DownloadFile(HttpWebRequest request)
  163. {
  164. using (var response = (HttpWebResponse)request.GetResponse())
  165. {
  166. var statusCode = response.StatusCode;
  167. if (statusCode == HttpStatusCode.OK)
  168. {
  169. var ms = new MemoryStream();
  170. var responseStream_ = response.GetResponseStream();
  171. responseStream_.CopyTo(ms);
  172. ms.Position = 0;
  173. responseStream_.Dispose();
  174. var fileResponse = new FileResponse((int)statusCode, ms);
  175. return fileResponse;
  176. }
  177. else
  178. {
  179. throw new Exception($"Status code is {statusCode}");
  180. }
  181. }
  182. //}
  183. //catch
  184. //{
  185. //}
  186. }
  187. #if ASYNC
  188. protected static async Task SendAsync(HttpWebRequest request)
  189. {
  190. using (var response = (HttpWebResponse)await request.GetResponseAsync())
  191. {
  192. var statusCode = response.StatusCode;
  193. if (statusCode == HttpStatusCode.OK
  194. || statusCode == HttpStatusCode.NoContent)
  195. {
  196. return;
  197. }
  198. else
  199. {
  200. throw new Exception($"Status code is {statusCode}");
  201. }
  202. }
  203. //}
  204. //catch
  205. //{
  206. //}
  207. }
  208. protected static async Task<TOut> SendAsync<TOut>(HttpWebRequest request)
  209. {
  210. using (var response = (HttpWebResponse)await request.GetResponseAsync())
  211. {
  212. if (response.StatusCode == HttpStatusCode.OK)
  213. {
  214. using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet)))
  215. {
  216. var json = await reader.ReadToEndAsync();
  217. TOut result = JsonConverter.Deserialize<TOut>(json);
  218. return result;
  219. }
  220. }
  221. else
  222. {
  223. throw new Exception($"Status code is {response.StatusCode}");
  224. }
  225. }
  226. //}
  227. //catch
  228. //{
  229. //}
  230. }
  231. protected static async Task<FileResponse> DownloadFileAsync(HttpWebRequest request)
  232. {
  233. using (var response = (HttpWebResponse)request.GetResponse())
  234. {
  235. var statusCode = response.StatusCode;
  236. if (statusCode == HttpStatusCode.OK)
  237. {
  238. var ms = new MemoryStream();
  239. var responseStream_ = response.GetResponseStream();
  240. await responseStream_.CopyToAsync(ms);
  241. ms.Position = 0;
  242. responseStream_.Dispose();
  243. var fileResponse = new FileResponse((int)statusCode, ms);
  244. return fileResponse;
  245. }
  246. else
  247. {
  248. throw new Exception($"Status code is {statusCode}");
  249. }
  250. }
  251. //}
  252. //catch
  253. //{
  254. //}
  255. }
  256. #endif
  257. protected HttpMessages(AuthService authService)
  258. {
  259. _authService = authService;
  260. }
  261. }
  262. }