From 65831fc474f0fc080800105757539e60abdb7c29 Mon Sep 17 00:00:00 2001 From: Robin Date: Thu, 9 Jun 2016 16:01:42 +0200 Subject: [PATCH] Fixed some issues when cloning HttpBehavior or HttpSettings [release] --- .../Dapplo.HttpExtensions.Net45.csproj | 4 ++-- Dapplo.HttpExtensions.Net45/packages.config | 2 +- Dapplo.HttpExtensions.PCL/project.json | 2 +- Dapplo.HttpExtensions.Shared/HttpBehaviour.cs | 5 +++-- Dapplo.HttpExtensions.Shared/IHttpBehaviour.cs | 9 ++------- Dapplo.HttpExtensions.Shared/IHttpSettings.cs | 11 +++-------- .../OAuth/OAuth2HttpBehaviourFactory.cs | 2 +- .../OAuth/OAuth2HttpMessageHandler.cs | 4 ++-- Dapplo.HttpExtensions.Shared/Support/HttpSettings.cs | 5 +++-- Dapplo.HttpExtensions.SharedDesktop/IHttpSettings.cs | 3 ++- .../OAuth/OAuth1HttpBehaviour.cs | 11 ++++++++--- .../OAuth/OAuth1HttpMessageHandler.cs | 4 ++-- .../HttpBehaviourExtensionsTests.cs | 2 +- .../HttpPartsPostTest.cs | 4 ++-- .../UriActionExtensionsTests.cs | 4 ++-- .../Dapplo.HttpExtensions.Tests.csproj | 4 ++-- Dapplo.HttpExtensions.Tests/packages.config | 2 +- Dapplo.HttpExtensions.nuspec | 10 +++++----- Dapplo.HttpExtensions/Dapplo.HttpExtensions.csproj | 4 ++-- Dapplo.HttpExtensions/packages.config | 2 +- 20 files changed, 46 insertions(+), 48 deletions(-) diff --git a/Dapplo.HttpExtensions.Net45/Dapplo.HttpExtensions.Net45.csproj b/Dapplo.HttpExtensions.Net45/Dapplo.HttpExtensions.Net45.csproj index a42065e..74520d1 100644 --- a/Dapplo.HttpExtensions.Net45/Dapplo.HttpExtensions.Net45.csproj +++ b/Dapplo.HttpExtensions.Net45/Dapplo.HttpExtensions.Net45.csproj @@ -37,8 +37,8 @@ ..\packages\Dapplo.LogFacade.0.2.45\lib\net45\Dapplo.LogFacade.dll True - - ..\packages\Dapplo.Utils.0.1.33\lib\net45\Dapplo.Utils.dll + + ..\packages\Dapplo.Utils.0.1.42\lib\net45\Dapplo.Utils.dll True diff --git a/Dapplo.HttpExtensions.Net45/packages.config b/Dapplo.HttpExtensions.Net45/packages.config index 6c40340..a6bdfc0 100644 --- a/Dapplo.HttpExtensions.Net45/packages.config +++ b/Dapplo.HttpExtensions.Net45/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/Dapplo.HttpExtensions.PCL/project.json b/Dapplo.HttpExtensions.PCL/project.json index 3fa968d..bad1179 100644 --- a/Dapplo.HttpExtensions.PCL/project.json +++ b/Dapplo.HttpExtensions.PCL/project.json @@ -6,7 +6,7 @@ }, "dependencies": { "Dapplo.LogFacade": "0.2.45", - "Dapplo.Utils": "0.1.33", + "Dapplo.Utils": "0.1.42", "Microsoft.NETCore": "5.0.0", "Microsoft.NETCore.Portable.Compatibility": "1.0.0", "System.ComponentModel": "4.0.0", diff --git a/Dapplo.HttpExtensions.Shared/HttpBehaviour.cs b/Dapplo.HttpExtensions.Shared/HttpBehaviour.cs index f8df2db..1d74ca8 100644 --- a/Dapplo.HttpExtensions.Shared/HttpBehaviour.cs +++ b/Dapplo.HttpExtensions.Shared/HttpBehaviour.cs @@ -21,6 +21,7 @@ #region using +using Dapplo.Utils; using System; using System.Collections.Generic; using System.Net.Http; @@ -116,10 +117,10 @@ public static IHttpBehaviour Current public int ReadBufferSize { get; set; } = HttpExtensionsGlobals.ReadBufferSize; /// - public IChangeableHttpBehaviour Clone() + public IChangeableHttpBehaviour ShallowClone() { var result = (HttpBehaviour) MemberwiseClone(); - result.HttpSettings = HttpSettings.Clone(); + result.HttpSettings = HttpSettings.ShallowClone(); return result; } diff --git a/Dapplo.HttpExtensions.Shared/IHttpBehaviour.cs b/Dapplo.HttpExtensions.Shared/IHttpBehaviour.cs index 0fc1174..429efb1 100644 --- a/Dapplo.HttpExtensions.Shared/IHttpBehaviour.cs +++ b/Dapplo.HttpExtensions.Shared/IHttpBehaviour.cs @@ -21,6 +21,7 @@ #region using +using Dapplo.Utils; using System; using System.Collections.Generic; using System.Net.Http; @@ -33,7 +34,7 @@ namespace Dapplo.HttpExtensions /// /// The IHttpBehaviour is used to control the behaviour of all operations in the HttpExtensions library. /// - public interface IHttpBehaviour + public interface IHttpBehaviour : IShallowCloneable { /// /// Specify if the progress actions (UploadProgress or DownloadProcess) are called @@ -135,12 +136,6 @@ public interface IHttpBehaviour /// bool ValidateResponseContentType { get; } - /// - /// Clone this HttpBehavior and return an interface which can be used to write - /// - /// IChangeableHttpBehaviour - IChangeableHttpBehaviour Clone(); - /// /// Set this IHttpBehaviour on the CallContext /// diff --git a/Dapplo.HttpExtensions.Shared/IHttpSettings.cs b/Dapplo.HttpExtensions.Shared/IHttpSettings.cs index ca4fcfb..33bcf02 100644 --- a/Dapplo.HttpExtensions.Shared/IHttpSettings.cs +++ b/Dapplo.HttpExtensions.Shared/IHttpSettings.cs @@ -21,6 +21,7 @@ #region using +using Dapplo.Utils; using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; @@ -47,9 +48,9 @@ namespace Dapplo.HttpExtensions /// /// #if _PCL_ - public interface IHttpSettings + public interface IHttpSettings : IShallowCloneable #else - public partial interface IHttpSettings + public partial interface IHttpSettings : IShallowCloneable #endif { /// @@ -137,11 +138,5 @@ public partial interface IHttpSettings /// [DefaultValue(true), Display(Description = "When true every http request will supply the default user credentials when the server asks for them"), DataMember(EmitDefaultValue = true)] bool UseDefaultCredentials { get; set; } - - /// - /// Clone this IHttpSettings - /// - /// IHttpSettings - IHttpSettings Clone(); } } \ No newline at end of file diff --git a/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpBehaviourFactory.cs b/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpBehaviourFactory.cs index e7c7455..7bfcfe2 100644 --- a/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpBehaviourFactory.cs +++ b/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpBehaviourFactory.cs @@ -35,7 +35,7 @@ public static class OAuth2HttpBehaviourFactory public static IHttpBehaviour Create(OAuth2Settings oAuth2Settings, IHttpBehaviour fromHttpBehaviour = null) { // Get a clone of a IHttpBehaviour (passed or current) - var oauthHttpBehaviour = (fromHttpBehaviour ?? HttpBehaviour.Current).Clone(); + var oauthHttpBehaviour = (fromHttpBehaviour ?? HttpBehaviour.Current).ShallowClone(); // Add a wrapper (delegate handler) which wraps all new HttpMessageHandlers oauthHttpBehaviour.ChainOnHttpMessageHandlerCreated(httpMessageHandler => new OAuth2HttpMessageHandler(oAuth2Settings, oauthHttpBehaviour, httpMessageHandler)); return oauthHttpBehaviour; diff --git a/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpMessageHandler.cs b/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpMessageHandler.cs index 3769d40..d3163cf 100644 --- a/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpMessageHandler.cs +++ b/Dapplo.HttpExtensions.Shared/OAuth/OAuth2HttpMessageHandler.cs @@ -86,7 +86,7 @@ public OAuth2HttpMessageHandler(OAuth2Settings oAuth2Settings, IHttpBehaviour ht } _oAuth2Settings = oAuth2Settings; - var newHttpBehaviour = httpBehaviour.Clone(); + var newHttpBehaviour = httpBehaviour.ShallowClone(); // Remove the OnHttpMessageHandlerCreated newHttpBehaviour.OnHttpMessageHandlerCreated = null; // Use it for internal communication @@ -280,7 +280,7 @@ private async Task GenerateRefreshTokenAsync(CancellationToken cancellationToken } } - var normalHttpBehaviour = _httpBehaviour.Clone(); + var normalHttpBehaviour = _httpBehaviour.ShallowClone(); normalHttpBehaviour.OnHttpMessageHandlerCreated = null; normalHttpBehaviour.MakeCurrent(); diff --git a/Dapplo.HttpExtensions.Shared/Support/HttpSettings.cs b/Dapplo.HttpExtensions.Shared/Support/HttpSettings.cs index e05f326..6ea4bc9 100644 --- a/Dapplo.HttpExtensions.Shared/Support/HttpSettings.cs +++ b/Dapplo.HttpExtensions.Shared/Support/HttpSettings.cs @@ -26,6 +26,7 @@ using System.Reflection; using System.Text; using System.Net.Http; +using Dapplo.Utils; #if !_PCL_ using System.Net.Cache; @@ -44,7 +45,7 @@ namespace Dapplo.HttpExtensions.Support /// Most have their normal defaults, which would also normally be used, some have special settings /// The default values and the property descriptions are in the IHttpSettings (which can be used by Dapplo.Config) /// - public class HttpSettings : IHttpSettings + public class HttpSettings : IHttpSettings, IShallowCloneable { private const int Kb = 1024; private const int Mb = Kb*1024; @@ -164,7 +165,7 @@ public string DefaultUserAgent /// This is needed by the HttpBehaviour to prevent that a modification of a copy is changing the global settings! /// /// - public IHttpSettings Clone() + public IHttpSettings ShallowClone() { return (IHttpSettings)MemberwiseClone(); } diff --git a/Dapplo.HttpExtensions.SharedDesktop/IHttpSettings.cs b/Dapplo.HttpExtensions.SharedDesktop/IHttpSettings.cs index b3a670f..1a72eb9 100644 --- a/Dapplo.HttpExtensions.SharedDesktop/IHttpSettings.cs +++ b/Dapplo.HttpExtensions.SharedDesktop/IHttpSettings.cs @@ -21,6 +21,7 @@ #region using +using Dapplo.Utils; using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; @@ -50,7 +51,7 @@ namespace Dapplo.HttpExtensions /// (Yes, it's can be empty, the settings are in the IHttpSettings interface) and than assign the generated instance to /// /// - public partial interface IHttpSettings + public partial interface IHttpSettings : IShallowCloneable { /// /// For more details, click diff --git a/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpBehaviour.cs b/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpBehaviour.cs index 1e8f31d..3c8cc08 100644 --- a/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpBehaviour.cs +++ b/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpBehaviour.cs @@ -21,6 +21,7 @@ #region using +using Dapplo.Utils; using System; using System.Collections.Generic; using System.Net.Http; @@ -44,7 +45,7 @@ public class OAuth1HttpBehaviour : IChangeableHttpBehaviour /// IHttpBehaviour to wrap public OAuth1HttpBehaviour(IHttpBehaviour httpBehaviour = null) { - _wrapped = (httpBehaviour ?? HttpBehaviour.Current).Clone(); + _wrapped = (httpBehaviour ?? HttpBehaviour.Current).ShallowClone(); } /// @@ -170,9 +171,13 @@ public bool ValidateResponseContentType } /// - public IChangeableHttpBehaviour Clone() + public IChangeableHttpBehaviour ShallowClone() { - return (OAuth1HttpBehaviour) MemberwiseClone(); + // the wrapper object will be clone when creating the OAuth1HttpBehaviour + var result = new OAuth1HttpBehaviour(_wrapped); + result.OnAccessTokenValues = OnAccessTokenValues; + result.BeforeSend = BeforeSend; + return result; } /// diff --git a/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpMessageHandler.cs b/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpMessageHandler.cs index 62c9275..e1113cf 100644 --- a/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpMessageHandler.cs +++ b/Dapplo.HttpExtensions.SharedDesktop/OAuth/OAuth1HttpMessageHandler.cs @@ -98,11 +98,11 @@ public OAuth1HttpMessageHandler(OAuth1Settings oAuth1Settings, OAuth1HttpBehavio _oAuth1Settings = oAuth1Settings; - var newHttpBehaviour = (OAuth1HttpBehaviour)oAuth1HttpBehaviour.Clone(); + var newHttpBehaviour = oAuth1HttpBehaviour.ShallowClone(); // Remove the OnHttpMessageHandlerCreated newHttpBehaviour.OnHttpMessageHandlerCreated = null; // Use it for internal communication - _oAuth1HttpBehaviour = newHttpBehaviour; + _oAuth1HttpBehaviour = (OAuth1HttpBehaviour)newHttpBehaviour; } /// diff --git a/Dapplo.HttpExtensions.Tests.Shared/HttpBehaviourExtensionsTests.cs b/Dapplo.HttpExtensions.Tests.Shared/HttpBehaviourExtensionsTests.cs index f9f2cce..00d6c73 100644 --- a/Dapplo.HttpExtensions.Tests.Shared/HttpBehaviourExtensionsTests.cs +++ b/Dapplo.HttpExtensions.Tests.Shared/HttpBehaviourExtensionsTests.cs @@ -69,7 +69,7 @@ public async Task TestHttpBehaviourChaining() bool testChainOnHttpMessageHandlerCreated1 = false; bool testChainOnHttpMessageHandlerCreated2 = false; - var testBehaviour = HttpBehaviour.Current.Clone(); + var testBehaviour = HttpBehaviour.Current.ShallowClone(); testBehaviour.ChainOnHttpContentCreated(x => { testChainOnHttpContentCreated1 = true; diff --git a/Dapplo.HttpExtensions.Tests.Shared/HttpPartsPostTest.cs b/Dapplo.HttpExtensions.Tests.Shared/HttpPartsPostTest.cs index 8c036e2..db056f4 100644 --- a/Dapplo.HttpExtensions.Tests.Shared/HttpPartsPostTest.cs +++ b/Dapplo.HttpExtensions.Tests.Shared/HttpPartsPostTest.cs @@ -56,7 +56,7 @@ public HttpPartsPostTest(ITestOutputHelper testOutputHelper) public async Task TestPost_Bitmap() { var testUri = RequestBinUri.AppendSegments("post"); - var uploadBehaviour = HttpBehaviour.Current.Clone(); + var uploadBehaviour = HttpBehaviour.Current.ShallowClone(); bool hasProgress = false; @@ -86,7 +86,7 @@ public async Task TestPost_Bitmap() public async Task TestPost_BitmapSource() { var testUri = RequestBinUri.AppendSegments("post"); - var uploadBehaviour = HttpBehaviour.Current.Clone(); + var uploadBehaviour = HttpBehaviour.Current.ShallowClone(); bool hasProgress = false; diff --git a/Dapplo.HttpExtensions.Tests.Shared/UriActionExtensionsTests.cs b/Dapplo.HttpExtensions.Tests.Shared/UriActionExtensionsTests.cs index 2e2f976..508c346 100644 --- a/Dapplo.HttpExtensions.Tests.Shared/UriActionExtensionsTests.cs +++ b/Dapplo.HttpExtensions.Tests.Shared/UriActionExtensionsTests.cs @@ -89,7 +89,7 @@ public async Task TestGetAsAsync204() [Fact] public async Task TestGetAsAsyncBitmap() { - var downloadBehaviour = HttpBehaviour.Current.Clone(); + var downloadBehaviour = HttpBehaviour.Current.ShallowClone(); downloadBehaviour.UseProgressStream = true; downloadBehaviour.DownloadProgress += progress => { Log.Info().WriteLine("Progress {0}", (int) (progress*100)); }; @@ -108,7 +108,7 @@ public async Task TestGetAsAsyncBitmap() public async Task TestGetAsAsyncBitmapSource() { - var uploadBehaviour = HttpBehaviour.Current.Clone(); + var uploadBehaviour = HttpBehaviour.Current.ShallowClone(); bool hasProgress = false; diff --git a/Dapplo.HttpExtensions.Tests/Dapplo.HttpExtensions.Tests.csproj b/Dapplo.HttpExtensions.Tests/Dapplo.HttpExtensions.Tests.csproj index c14c5c5..3d70575 100644 --- a/Dapplo.HttpExtensions.Tests/Dapplo.HttpExtensions.Tests.csproj +++ b/Dapplo.HttpExtensions.Tests/Dapplo.HttpExtensions.Tests.csproj @@ -38,8 +38,8 @@ ..\packages\Dapplo.LogFacade.0.2.45\lib\net45\Dapplo.LogFacade.dll True - - ..\packages\Dapplo.Utils.0.1.33\lib\net45\Dapplo.Utils.dll + + ..\packages\Dapplo.Utils.0.1.42\lib\net45\Dapplo.Utils.dll True diff --git a/Dapplo.HttpExtensions.Tests/packages.config b/Dapplo.HttpExtensions.Tests/packages.config index b00d17d..03c910e 100644 --- a/Dapplo.HttpExtensions.Tests/packages.config +++ b/Dapplo.HttpExtensions.Tests/packages.config @@ -2,7 +2,7 @@ - + diff --git a/Dapplo.HttpExtensions.nuspec b/Dapplo.HttpExtensions.nuspec index dd32605..ee81444 100644 --- a/Dapplo.HttpExtensions.nuspec +++ b/Dapplo.HttpExtensions.nuspec @@ -19,11 +19,11 @@ - + - + @@ -32,7 +32,7 @@ - + @@ -41,7 +41,7 @@ - + @@ -50,7 +50,7 @@ - + diff --git a/Dapplo.HttpExtensions/Dapplo.HttpExtensions.csproj b/Dapplo.HttpExtensions/Dapplo.HttpExtensions.csproj index de971db..1d7ea00 100644 --- a/Dapplo.HttpExtensions/Dapplo.HttpExtensions.csproj +++ b/Dapplo.HttpExtensions/Dapplo.HttpExtensions.csproj @@ -41,8 +41,8 @@ ..\packages\Dapplo.LogFacade.0.2.45\lib\net45\Dapplo.LogFacade.dll True - - ..\packages\Dapplo.Utils.0.1.33\lib\net45\Dapplo.Utils.dll + + ..\packages\Dapplo.Utils.0.1.42\lib\net45\Dapplo.Utils.dll True diff --git a/Dapplo.HttpExtensions/packages.config b/Dapplo.HttpExtensions/packages.config index ae38500..ac7e467 100644 --- a/Dapplo.HttpExtensions/packages.config +++ b/Dapplo.HttpExtensions/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file