From d302acbd4e22861a84565d7de03f48c59ff4602d Mon Sep 17 00:00:00 2001 From: miro Date: Wed, 11 Dec 2019 15:43:56 +0100 Subject: [PATCH 1/2] [Issue-18] Adding an enricher to manipulate the http-handler --- src/Innovator.Client/ConnectionPreferences.cs | 12 ++++ src/Innovator.Client/Factory.cs | 65 ++++++++++--------- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/Innovator.Client/ConnectionPreferences.cs b/src/Innovator.Client/ConnectionPreferences.cs index 0c7bcf19..876fadbb 100644 --- a/src/Innovator.Client/ConnectionPreferences.cs +++ b/src/Innovator.Client/ConnectionPreferences.cs @@ -19,6 +19,9 @@ public class ConnectionPreferences { private ArasHeaders _headers; + private Action _httpClientHandlerEnricher; + + /// /// By default, connections to URLs with mapping files will send login requests to /// any defined authentication service. If the callback is overriden, it will be used @@ -54,6 +57,15 @@ public class ConnectionPreferences /// public string Url { get; set; } + /// + /// An Action that is called on the httpHandler of the DefaultHttpClient + /// + public Action HttpClientHandlerEnricher + { + get => _httpClientHandlerEnricher ?? (h => { }); + set => _httpClientHandlerEnricher = HttpClientHandlerEnricher; + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Innovator.Client/Factory.cs b/src/Innovator.Client/Factory.cs index 331b4213..22d598c0 100644 --- a/src/Innovator.Client/Factory.cs +++ b/src/Innovator.Client/Factory.cs @@ -23,6 +23,7 @@ public static class Factory { private static Action>> _logListener; private static MemoryCache _imageCache = new MemoryCache(); + private static ConnectionPreferences _preferences; internal static Func DefaultService { get; set; } @@ -60,6 +61,7 @@ static Factory() { CookieContainer = new CookieContainer() }; + _preferences.HttpClientHandlerEnricher(handler); var infinite = TimeSpan.FromMilliseconds(-1); return new SyncHttpClient(handler) { Timeout = infinite }; }; @@ -116,12 +118,12 @@ public static IRemoteConnection GetConnection(ConnectionPreferences preferences) /// public static IRemoteConnection GetConnection(string url, string userAgent) { - var prefs = new ConnectionPreferences + _preferences = new ConnectionPreferences { Url = url }; - prefs.Headers.UserAgent = userAgent; - return GetConnection(prefs, false).Value; + _preferences.Headers.UserAgent = userAgent; + return GetConnection(_preferences, false).Value; } /// @@ -132,9 +134,9 @@ public static IRemoteConnection GetConnection(string url, string userAgent) /// A connection object public static IRemoteConnection GetConnection(string url, ConnectionPreferences preferences) { - preferences = preferences ?? new ConnectionPreferences(); - preferences.Url = url; - return GetConnection(preferences, false).Value; + _preferences = preferences ?? new ConnectionPreferences(); + _preferences.Url = url; + return GetConnection(_preferences, false).Value; } /// @@ -148,9 +150,9 @@ public static IRemoteConnection GetConnection(string url, ConnectionPreferences public static IPromise GetConnection(string url , ConnectionPreferences preferences, bool async) { - preferences = preferences ?? new ConnectionPreferences(); - preferences.Url = url; - return GetConnection(preferences, async); + _preferences = preferences ?? new ConnectionPreferences(); + _preferences.Url = url; + return GetConnection(_preferences, async); } /// @@ -162,8 +164,8 @@ public static IPromise GetConnection(string url /// A promise to return a connection object public static IPromise GetConnection(ConnectionPreferences preferences, bool async) { - preferences = preferences ?? new ConnectionPreferences(); - var url = preferences.Url; + _preferences = preferences ?? new ConnectionPreferences(); + var url = _preferences.Url; url = (url ?? "").TrimEnd('/'); if (url.EndsWith("Server/InnovatorServer.aspx", StringComparison.OrdinalIgnoreCase)) @@ -171,8 +173,8 @@ public static IPromise GetConnection(ConnectionPreferences pr if (!url.EndsWith("/server", StringComparison.OrdinalIgnoreCase)) url += "/Server"; var configUrl = url + "/mapping.xml"; - var masterService = preferences.HttpService ?? DefaultService.Invoke(); - var arasSerice = preferences.HttpService ?? DefaultService.Invoke(); + var masterService = _preferences.HttpService ?? DefaultService.Invoke(); + var arasSerice = _preferences.HttpService ?? DefaultService.Invoke(); Func connFactory = m => { var uri = (m.Url ?? "").TrimEnd('/'); @@ -182,17 +184,17 @@ public static IPromise GetConnection(ConnectionPreferences pr case ServerType.Proxy: throw new NotSupportedException(); default: - return ArasConn(arasSerice, uri, preferences); + return ArasConn(arasSerice, uri, _preferences); } }; var result = new Promise(); var req = new HttpRequest { - UserAgent = preferences.Headers.UserAgent + UserAgent = _preferences.Headers.UserAgent }; req.SetHeader("Accept", "text/xml"); - foreach (var header in preferences.Headers.NonUserAgentHeaders()) + foreach (var header in _preferences.Headers.NonUserAgentHeaders()) { req.SetHeader(header.Key, header.Value); } @@ -208,7 +210,7 @@ public static IPromise GetConnection(ConnectionPreferences pr var data = r.AsString(); if (string.IsNullOrEmpty(data)) { - result.Resolve(ArasConn(arasSerice, url, preferences)); + result.Resolve(ArasConn(arasSerice, url, _preferences)); } else { @@ -217,7 +219,7 @@ public static IPromise GetConnection(ConnectionPreferences pr var servers = ServerMapping.FromXml(data).ToArray(); if (servers.Length < 1) { - result.Resolve(ArasConn(arasSerice, url, preferences)); + result.Resolve(ArasConn(arasSerice, url, _preferences)); } else if (servers.Length == 1) { @@ -229,28 +231,28 @@ public static IPromise GetConnection(ConnectionPreferences pr { server.Factory = connFactory; } - result.Resolve(new MappedConnection(servers, preferences.AuthCallback)); + result.Resolve(new MappedConnection(servers, _preferences.AuthCallback)); } } catch (XmlException) { - result.Resolve(ArasConn(arasSerice, url, preferences)); + result.Resolve(ArasConn(arasSerice, url, _preferences)); } } }).Fail(ex => { - result.Resolve(ArasConn(arasSerice, url, preferences)); + result.Resolve(ArasConn(arasSerice, url, _preferences)); })).Always(trace.Dispose); - if (preferences.Credentials != null) + if (_preferences.Credentials != null) { IRemoteConnection conn = null; return result .Continue(c => { conn = c; - return c.Login(preferences.Credentials, async); + return c.Login(_preferences.Credentials, async); }) .Convert(u => conn); } @@ -258,20 +260,21 @@ public static IPromise GetConnection(ConnectionPreferences pr return result; } - private static IRemoteConnection ArasConn(HttpClient arasService, string url, ConnectionPreferences preferences) + private static IRemoteConnection ArasConn(HttpClient arasService, string url, ConnectionPreferences pref) { - var result = new Connection.ArasHttpConnection(arasService, url, preferences.ItemFactory); - if (preferences.Headers.Any() || preferences.DefaultTimeout.HasValue) + _preferences = pref; + var result = new Connection.ArasHttpConnection(arasService, url, _preferences.ItemFactory); + if (_preferences.Headers.Any() || _preferences.DefaultTimeout.HasValue) { result.DefaultSettings(r => { - if (preferences.DefaultTimeout.HasValue) - r.Timeout = TimeSpan.FromMilliseconds(preferences.DefaultTimeout.Value); + if (_preferences.DefaultTimeout.HasValue) + r.Timeout = TimeSpan.FromMilliseconds(_preferences.DefaultTimeout.Value); - if (!string.IsNullOrEmpty(preferences.Headers.UserAgent)) - r.UserAgent = preferences.Headers.UserAgent; + if (!string.IsNullOrEmpty(_preferences.Headers.UserAgent)) + r.UserAgent = _preferences.Headers.UserAgent; - foreach (var header in preferences.Headers.NonUserAgentHeaders()) + foreach (var header in _preferences.Headers.NonUserAgentHeaders()) { r.SetHeader(header.Key, header.Value); } From cc469eafc87d90ce2d157e8f13629fe2e8b72559 Mon Sep 17 00:00:00 2001 From: miro Date: Fri, 13 Dec 2019 10:25:35 +0100 Subject: [PATCH 2/2] [Issue-18] fixed simplier assigning default-values --- src/Innovator.Client/ConnectionPreferences.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Innovator.Client/ConnectionPreferences.cs b/src/Innovator.Client/ConnectionPreferences.cs index 876fadbb..c138d0d1 100644 --- a/src/Innovator.Client/ConnectionPreferences.cs +++ b/src/Innovator.Client/ConnectionPreferences.cs @@ -19,9 +19,6 @@ public class ConnectionPreferences { private ArasHeaders _headers; - private Action _httpClientHandlerEnricher; - - /// /// By default, connections to URLs with mapping files will send login requests to /// any defined authentication service. If the callback is overriden, it will be used @@ -60,11 +57,8 @@ public class ConnectionPreferences /// /// An Action that is called on the httpHandler of the DefaultHttpClient /// - public Action HttpClientHandlerEnricher - { - get => _httpClientHandlerEnricher ?? (h => { }); - set => _httpClientHandlerEnricher = HttpClientHandlerEnricher; - } + public Action HttpClientHandlerEnricher { get; set; } = h => { }; + /// /// Initializes a new instance of the class.