Skip to content

Commit 7274e05

Browse files
committed
OpenStackNet.Configuring event replaces OpenStackNet.Configure
* Allow multiple persons to configure things without a master coordinator. * Finalization of configuration is still triggered when OpenStackNet.Configuration is accessed.
1 parent 2229368 commit 7274e05

File tree

4 files changed

+71
-53
lines changed

4 files changed

+71
-53
lines changed

src/corelib/Extensions/FlurlExtensions.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Globalization;
43
using System.Linq;
54
using System.Net;
65
using System.Net.Http;

src/corelib/OpenStackNet.cs

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static class OpenStackNet
1919
{
2020
/// <summary>
2121
/// Global configuration which affects OpenStack.NET's behavior.
22-
/// <para>Modify using <see cref="Configure(Action{OpenStackNetConfigurationOptions})"/>.</para>
22+
/// <para>Customize using the <see cref="Configuring"/> event.</para>
2323
/// </summary>
2424
public static OpenStackNetConfigurationOptions Configuration
2525
{
@@ -36,34 +36,19 @@ public static OpenStackNetConfigurationOptions Configuration
3636
private static bool _isConfigured;
3737

3838
/// <summary>
39-
/// <para>DEPRECATED. This no longer needs to be explicityly called, unless you require customizations. In that case, use <see cref="Configure(Action{OpenStackNetConfigurationOptions})"/> .</para>
40-
/// Initializes the SDK using the default configuration.
39+
/// Occurs when initializing the global configuration for OpenStack.NET.
4140
/// </summary>
42-
[Obsolete("This will be removed in v2.0. Use Configure(Action{OpenStackNetConfigurationOptions}) instead if you need to customize anything.")]
43-
public static void Configure()
44-
{
45-
Configure(null);
46-
}
41+
public static event Action<OpenStackNetConfigurationOptions> Configuring;
4742

4843
/// <summary>
49-
/// <para>Provides thread-safe accesss to OpenStack.NET's global configuration options.</para>
50-
/// <para>Can only be called once at application start-up, before instantiating any OpenStack.NET objects.</para>
51-
/// </summary>
52-
/// <param name="configure">Additional configuration of OpenStack.NET's global settings.</param>
53-
public static void Configure(Action<OpenStackNetConfigurationOptions> configure)
54-
{
55-
Configure(null, configure);
56-
}
57-
58-
/// <summary>
59-
/// <para>DEPRECATED, use <see cref="Configure(Action{OpenStackNetConfigurationOptions})"/> instead.</para>
44+
/// <para>DEPRECATED, use the <see cref="Configuring"/> event instead.</para>
6045
/// <para>Provides thread-safe accesss to OpenStack.NET's global configuration options.</para>
6146
/// <para>Can only be called once at application start-up, before instantiating any OpenStack.NET objects.</para>
6247
/// </summary>
6348
/// <param name="configureFlurl">Addtional configuration of the OpenStack.NET Flurl client settings <seealso cref="Flurl.Http.FlurlHttp.Configure" />.</param>
6449
/// <param name="configure">Additional configuration of OpenStack.NET's global settings.</param>
65-
[Obsolete("This will be removed in v2.0. Use Configure(Action{OpenStackNetConfigurationOptions}) instead.")]
66-
public static void Configure(Action<FlurlHttpSettings> configureFlurl, Action<OpenStackNetConfigurationOptions> configure)
50+
[Obsolete("This will be removed in v2.0. Use the OpenStackNet.Configuring event instead.")]
51+
public static void Configure(Action<FlurlHttpSettings> configureFlurl = null, Action<OpenStackNetConfigurationOptions> configure = null)
6752
{
6853
lock (ConfigureLock)
6954
{
@@ -76,25 +61,30 @@ public static void Configure(Action<FlurlHttpSettings> configureFlurl, Action<Op
7661
return;
7762
}
7863

79-
// TODO: Use the line below once we hit 2.0 and configureFlurl is deprecated
80-
// _config = new OpenStackNetConfigurationOptions(configure);
81-
_config = new OpenStackNetConfigurationOptions(options =>
82-
{
83-
configureFlurl?.Invoke(options.FlurlHttpSettings);
84-
configure?.Invoke(options);
85-
});
64+
// Give the application an opportunity to tweak the default config
65+
_config = OpenStackNetConfigurationOptions.Create();
66+
Configuring?.Invoke(_config);
67+
68+
// Apply legacy custom configuration, removed in 2.0 as it's replaced by the Configuring event
69+
configureFlurl?.Invoke(_config.FlurlHttpSettings);
70+
71+
// Finish configuration and lock it
72+
_config.CompleteInitialization();
73+
8674
_isConfigured = true;
8775
}
8876
}
8977

9078
/// <summary>
91-
/// Resets all configuration (OpenStack.NET, Flurl and Json.NET) so that <see cref="Configure(Action{OpenStackNetConfigurationOptions})"/> can be called again.
79+
/// <par>Resets all configuration (OpenStack.NET, Flurl and Json.NET).</par>
80+
/// <para>After this is called, you must re-register any <see cref="Configuring"/> event handlers.</para>
9281
/// </summary>
9382
public static void ResetDefaults()
9483
{
9584
lock (ConfigureLock)
9685
{
9786
_config = null;
87+
Configuring = null;
9888
_isConfigured = false;
9989
}
10090
}
@@ -144,30 +134,46 @@ private static string SerializeHttpCall(HttpCall httpCall)
144134

145135
/// <summary>
146136
/// A readonly set of properties that affect OpenStack.NET's behavior.
147-
/// <para>To configure, pass a custom action via the static <see cref="OpenStackNet.Configure(Action{OpenStackNetConfigurationOptions})"/> method.</para>
137+
/// <para>To customize, register an event handler for <see cref="OpenStackNet.Configuring"/>.</para>
148138
/// </summary>
149139
public class OpenStackNetConfigurationOptions
150140
{
151-
private readonly bool _isInitialized;
141+
private bool _isInitialized;
152142
private readonly FlurlHttpSettings _flurlHttpSettings;
153143
private readonly JsonSerializerSettings _jsonSerializerSettings;
154144
private readonly List<ProductInfoHeaderValue> _userAgents;
155145

156146
/// <summary/>
157-
protected internal OpenStackNetConfigurationOptions(Action<OpenStackNetConfigurationOptions> configure = null)
147+
protected OpenStackNetConfigurationOptions()
158148
{
159149
_flurlHttpSettings = new FlurlHttpSettings();
160150
_jsonSerializerSettings = new JsonSerializerSettings();
161-
_userAgents = new List<ProductInfoHeaderValue>
162-
{
163-
new ProductInfoHeaderValue("openstack.net", GetType().GetAssemblyFileVersion())
164-
};
151+
_userAgents = new List<ProductInfoHeaderValue>();
152+
}
153+
154+
/// <summary />
155+
public static event Action<CreateEvent> Creating;
156+
157+
/// <summary />
158+
internal static OpenStackNetConfigurationOptions Create()
159+
{
160+
var createEvent = new CreateEvent();
161+
Creating?.Invoke(createEvent);
162+
return createEvent.Result;
163+
}
165164

166-
configure?.Invoke(this);
165+
/// <summary />
166+
public void CompleteInitialization()
167+
{
168+
OnCompleteInitialization();
167169
ApplyDefaults();
168170
_isInitialized = true;
169171
}
170172

173+
/// <summary />
174+
protected virtual void OnCompleteInitialization()
175+
{}
176+
171177
/// <summary>
172178
/// Custom Flurl.Http configuration settings which are specific to requests made by this SDK.
173179
/// </summary>
@@ -215,6 +221,8 @@ private void ApplyDefaults()
215221
//
216222
// Apply our default settings on top of user customizations, hopefully without clobbering anything
217223
//
224+
UserAgents.Add(new ProductInfoHeaderValue("openstack.net", GetType().GetAssemblyFileVersion()));
225+
218226
_jsonSerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;
219227
_jsonSerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
220228
_jsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
@@ -257,5 +265,12 @@ private void SetUserAgentHeader(HttpCall call)
257265
call.Request.Headers.UserAgent.Add(userAgent);
258266
}
259267
}
268+
269+
/// <summary />
270+
public class CreateEvent
271+
{
272+
/// <summary />
273+
public OpenStackNetConfigurationOptions Result = new OpenStackNetConfigurationOptions();
274+
}
260275
}
261276
}

src/corelib/Testing/HttpTest.cs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Net;
33
using System.Net.Http;
44
using Flurl;
5-
using Flurl.Http;
65
using Flurl.Http.Configuration;
76
using Flurl.Http.Content;
87
using OpenStack.Authentication;
@@ -21,19 +20,19 @@ public class HttpTest : Flurl.Http.Testing.HttpTest, IDisposable
2120
/// <summary>
2221
/// Initializes a new instance of the <see cref="HttpTest"/> class.
2322
/// </summary>
24-
/// <param name="configure">Additional configuration of OpenStack.NET's global settings.</param>
25-
public HttpTest(Action<OpenStackNetConfigurationOptions> configure = null)
23+
public HttpTest()
2624
{
27-
Action<FlurlHttpSettings> setTestMode = settings =>
25+
OpenStackNet.ResetDefaults();
26+
OpenStackNet.Configuring += SetTestMode;
27+
}
28+
29+
private void SetTestMode(OpenStackNetConfigurationOptions options)
30+
{
31+
options.FlurlHttpSettings.HttpClientFactory = new TestHttpClientFactory(this);
32+
options.FlurlHttpSettings.AfterCall = call =>
2833
{
29-
settings.HttpClientFactory = new TestHttpClientFactory(this);
30-
settings.AfterCall = call =>
31-
{
32-
CallLog.Add(call);
33-
};
34+
CallLog.Add(call);
3435
};
35-
OpenStackNet.ResetDefaults();
36-
OpenStackNet.Configure(setTestMode, configure);
3736
}
3837

3938
/// <inheritdoc />

src/testing/unit/OpenStackNetTests.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void Dispose()
3030
public void WhenConfigureIsCalled_GlobalFlurlConfiguration_IsNotAltered()
3131
{
3232
// User makes their own tweaks to Flurl
33-
Action<HttpCall> customErrorHandler = call => Debug.WriteLine("I saw an erro!");
33+
Action<HttpCall> customErrorHandler = call => Debug.WriteLine("I saw an error!");
3434
FlurlHttp.GlobalSettings.OnError = customErrorHandler;
3535

3636
// We configure openstack.net
@@ -48,7 +48,7 @@ public void WhenConfigureIsCalled_GlobalFlurlConfiguration_IsNotAltered()
4848
public void WhenResetDefaultsIsCalled_GlobalFlurlConfiguration_IsNotAltered()
4949
{
5050
// User makes their own tweaks to Flurl
51-
Action<HttpCall> customErrorHandler = call => Debug.WriteLine("I saw an erro!");
51+
Action<HttpCall> customErrorHandler = call => Debug.WriteLine("I saw an error!");
5252
FlurlHttp.GlobalSettings.OnError = customErrorHandler;
5353

5454
// We configure openstack.net
@@ -122,9 +122,14 @@ public async Task UserAgentOnlyListOnceTest()
122122
[Fact]
123123
public async Task UserAgentWithApplicationSuffixTest()
124124
{
125-
using (var httpTest = new HttpTest(configure: options =>
126-
options.UserAgents.Add(new ProductInfoHeaderValue("(unittests)"))))
125+
using (var httpTest = new HttpTest())
127126
{
127+
// Apply a custom application user agent
128+
OpenStackNet.Configuring += options =>
129+
{
130+
options.UserAgents.Add(new ProductInfoHeaderValue("(unittests)"));
131+
};
132+
128133
await "http://api.com".PrepareRequest().GetAsync();
129134

130135
var userAgent = httpTest.CallLog[0].Request.Headers.UserAgent.ToString();

0 commit comments

Comments
 (0)