### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\Configurations\XHttpServiceConfiguration.cs namespace xHttpService.Configurations { public partial class XHttpServiceConfiguration { /// /// Determines Http Handler Check SSL or not ... /// /// public bool DisableSSLCheck { get; set; } public int DefaultClientTimeout { get; set; } = 360; } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\Constants\ConfigurationNodeNames.cs namespace xHttpService.Constants { public partial struct ConfigurationNodeNames { public const string HTTP_SERVICE_NODE_NAME = "HttpServiceConfiguration"; } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\Constants\XHttpMethod.cs using xExceptions.Attributes; namespace xHttpService.Constants { public enum XHttpMethod { [StringValue ("GET")] GET, [StringValue ("POST")] POST, [StringValue ("PUT")] PUT, [StringValue ("DELETE")] DELETE } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\DI\XDIHelperExtension.cs using System; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using xCommons.Extensions; using xHttpService.Configurations; using xHttpService.Constants; using xHttpService.Interfaces; using xHttpService.Providers; namespace xHttpService.DI { public static partial class XDIHelperExtension { /// /// Retrieve XHttpService Configuration from AppSettings /// /// /// public static XHttpServiceConfiguration GetXHttpServiceConfiguration (this IConfiguration configuration) { // var xHttpSection = configuration.GetSection (ConfigurationNodeNames.HTTP_SERVICE_NODE_NAME); return xHttpSection.Get (); } /// /// Register XHttpService Configuration /// /// /// public static void AddXHttpServiceConfiguration ( this IServiceCollection services, IConfiguration configuration ) { // var httpServiceConfiguration = configuration.GetXHttpServiceConfiguration (); services.AddXHttpServiceConfiguration(httpServiceConfiguration); } /// /// Register XHttpService Configuration /// /// /// public static void AddXHttpServiceConfiguration ( this IServiceCollection services, XHttpServiceConfiguration configuration ) { // if (configuration.IsNull ()) { Console.WriteLine($"xHttpService: there is no provided configurations, using default ..."); configuration = new XHttpServiceConfiguration (); } // services.AddSingleton (configuration); } /// /// Register XHttpService on DI ... /// /// /// public static void AddXHttpService ( this IServiceCollection services, IConfiguration configuration ) { // // Register Service Configuration ... if (services.GetRegisteredService ().IsNull ()) { services.AddXHttpServiceConfiguration (configuration); } // // Register Service ... services.AddSingleton (); } /// /// Register XHttpService on DI ... /// /// /// public static void AddXHttpService ( this IServiceCollection services, XHttpServiceConfiguration configuration ) { // // Register Service Configuration ... if (services.GetRegisteredService ().IsNull ()) { services.AddXHttpServiceConfiguration (configuration); } // // Register Service ... services.AddSingleton (); } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\Extensions\RestSharpExtensions.cs using System.ComponentModel.DataAnnotations; using AutoMapper.Mappers; using RestSharp; using xCommons.Constants; using xCommons.Extensions; using xModels.Dtos; namespace xHttpService.Extensions { public static partial class RestSharpExtensions { /// /// Attach an instance of XQuery to a RestRequest object /// /// /// /// public static RestRequest AttachXQuery( this RestRequest source, XQuery query ) { // if (query.IsNull()) { return source; } // // ContainsDetail ... // var containsDetailKey = System.Uri.EscapeDataString(nameof(query.ContainsDetail)); var containsDetailValue = query.ContainsDetail.AsHttpParamString(); source.AddQueryParameter(containsDetailKey, containsDetailValue); // // IsAscending ... var isAscendingKey = System.Uri.EscapeDataString(nameof(query.IsAscending)); var isAscendingValue = query.IsAscending.AsHttpParamString(); source.AddQueryParameter(isAscendingKey, isAscendingValue); // // Filter ... if (!query.Filter.IsNullOrEmpty()) { // var key = System.Uri.EscapeDataString(nameof(query.Filter)); var value = query.Filter.AsHttpParamString(); source.AddQueryParameter(key, value); } // // SortBy ... if (!query.SortBy.IsNullOrEmpty()) { // var key = System.Uri.EscapeDataString(nameof(query.SortBy)); var value = query.SortBy.AsHttpParamString(); source.AddQueryParameter(key, value); } // // Page ... if (query.Page > 0) { // var key = System.Uri.EscapeDataString(nameof(query.Page)); var value = query.Page.AsHttpParamString(); source.AddQueryParameter(key, value); } // // PageSize ... if (query.PageSize > 0) { // var key = System.Uri.EscapeDataString(nameof(query.PageSize)); var value = query.PageSize.AsHttpParamString(); source.AddQueryParameter(key, value); } // return source; } /// /// Add Dest User to Query Strings ... /// /// /// /// public static RestRequest AttachDestUser( this RestRequest source, string destUser ) { // if (destUser.IsNullOrEmpty()) { return source; } // var destUserKey = System.Uri.EscapeDataString(nameof(destUser)); var destUserValue = destUser.AsHttpParamString(); source.AddQueryParameter(destUserKey, destUserValue); // return source; } /// /// Add XPoweredBy Header to specific RestRequest Headers ... /// /// /// /// public static RestRequest AddXPoweredBy( this RestRequest source, string poweredByValue ) { // source.AddHeader( XAuthorization.XPoweredBy, poweredByValue ); // return source; } /// /// Add XAccessToken Header to specific RestRequest Headers ... /// /// /// /// public static RestRequest AddXAccessToken( this RestRequest source, string token ) { // token = $"{XAuthentication.BEARER} {token}"; // source.AddHeader( XAuthorization.Header, token ); // return source; } } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\Interfaces\IXHttpProvider.cs using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using RestSharp; using xHttpService.Constants; using xIdentityModels.Models; namespace xHttpService.Interfaces { public partial interface IXHttpProvider { HttpClient GetHttpClient (); RestClient GetRestClient ( string baseUrl = null, string poweredByValue = null, XTokenResponse tokens = null ); RestRequest GetRestRequet ( string endpoint, IDictionary @params = null, IDictionary headers = null, IDictionary queryStrings = null ); Task RunRestRequest ( RestClient client, RestRequest request, XHttpMethod method ); } } ### FILE: C:\Users\SaherElm\Documents\Projects\xSaherelmWorkspace\Modules\xHttpService\Providers\XHttpProvider.cs using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using RestSharp; using RestSharp.Authenticators; using xCommons.Constants; using xCommons.Extensions; using xExceptions.Constants; using xHttpService.Configurations; using xHttpService.Constants; using xHttpService.Interfaces; using xIdentityModels.Models; using xModels.Base; namespace xHttpService.Providers { public partial class XHttpProvider : XBaseClass, IXHttpProvider { private readonly XHttpServiceConfiguration configuration; public XHttpProvider ( ILoggerFactory loggerFactory, XHttpServiceConfiguration configuration ) : base (loggerFactory) { this.configuration = configuration; } // #region Actions ... /// /// Get an Instance of Http Client /// /// public HttpClient GetHttpClient () { // HttpClient httpClient = null; httpClient = new HttpClient (); // if (configuration.DisableSSLCheck) { // var httpHandler = new HttpClientHandler (); httpHandler.ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; // httpClient = new HttpClient (httpHandler); } // // Set Timeout ... httpClient.Timeout = TimeSpan .FromSeconds (configuration.DefaultClientTimeout); // return httpClient; } /// /// Get an Instance of RestClient /// /// /// /// /// public RestClient GetRestClient ( string baseUrl = null, string poweredByValue = null, XTokenResponse tokens = null ) { // var client = new RestClient (baseUrl); // // Add XPowered By to Default Headers ... if (!poweredByValue.IsNullOrEmpty ()) { client.AddDefaultHeader (XAuthorization.XPoweredBy, poweredByValue); } // // Set Authenticator ... if (!tokens.IsNull () && !tokens.AccessToken.IsNullOrEmpty ()) { client.Authenticator = new JwtAuthenticator (tokens.AccessToken); } // // Refresh Token ... if (!tokens.IsNull () && !tokens.RefreshToken.IsNullOrEmpty ()) { client.AddDefaultHeader (XAuthorization.RefreshToken, tokens.RefreshToken); } // // ExpiresAt ... if (!tokens.IsNull () && tokens.ExpiresAt > 0) { client.AddDefaultHeader (XAuthorization.ExpiresAt, tokens.ExpiresAt.AsHttpParamString ()); } // // Set Default Timeout ... client.Timeout = configuration.DefaultClientTimeout; // // SSL Validation Handler ... if (configuration.DisableSSLCheck) { client.RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; } // return client; } /// /// Get an Instance of RestRequest /// /// /// /// /// /// public RestRequest GetRestRequet ( string endpoint, IDictionary @params = null, IDictionary headers = null, IDictionary queryStrings = null ) { // var url = endpoint.ToString (); // // Add Route Payloads ... if (!@params.IsNull () && @params.Count > 0) { // var enumerator = @params.GetEnumerator (); while (enumerator.MoveNext ()) { // var item = enumerator.Current; // url = url.Replace (item.Key, item.Value.ToUrlEncoded ()); } } // // Add Query Strings ... if (!queryStrings.IsNull () && queryStrings.Count > 0) { // url = $"{url}?"; var enumerator = queryStrings.GetEnumerator (); while (enumerator.MoveNext ()) { // var item = enumerator.Current; // url += $"{item.Key}={item.Value.ToUrlEncoded ()}&"; } // // remove lates & ... if (url.EndsWith ("&")) { url = url.Substring (0, url.Length - 1); } } // // Create request ... var request = new RestRequest (url, DataFormat.Json); // // Add Headers to request ... if (!headers.IsNull () && headers.Count > 0) { // var enumerator = headers.GetEnumerator (); while (enumerator.MoveNext ()) { // var item = enumerator.Current; request.AddHeader (item.Key, item.Value); } } // return request; } /// /// Handle Call Specific Request and retrieve Response /// /// /// /// /// /// public async Task RunRestRequest ( RestClient client, RestRequest request, XHttpMethod method ) { // var response = await Task.Run (() => { // IRestResponse resp = null; // // Call Endpoint Service using Specified Method ... switch (method) { // // Get ... case XHttpMethod.GET: resp = client.Get (request); break; // // Put ... case XHttpMethod.PUT: resp = client.Put (request); break; // // Post ... case XHttpMethod.POST: resp = client.Post (request); break; // // Delete ... case XHttpMethod.DELETE: resp = client.Delete (request); break; } // if (!resp.IsSuccessful) { // // UnAuthorized ... if (resp.StatusCode == System.Net.HttpStatusCode.Unauthorized) { XException.NotAuthorized.Throw (); } // // NotFound ... if (resp.StatusCode == System.Net.HttpStatusCode.NotFound) { XException.NotFound.Throw (); } // // Timeout ... if (!resp.ErrorMessage.IsNullOrEmpty () && resp.ErrorMessage.Contains ("timed out")) { XException.Timeout.Throw (); } // // ErrorMessage ... if (!resp.ErrorMessage.IsNullOrEmpty ()) { throw new Exception (resp.ErrorMessage); } // // Default Exception ... XException.BadRequest.Throw (); } // var result = resp.Content.FromJSON (); return result; }); // return response; } #endregion } }