Skip to content

Commit fa1fb95

Browse files
authored
Merge pull request #857 from microsoftgraph/andrueastman/compressionAlignment
fix: automatic decompression of response content
2 parents 441c3af + a501198 commit fa1fb95

File tree

4 files changed

+36
-51
lines changed

4 files changed

+36
-51
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project does adheres to [Semantic Versioning](https://semver.org/spec/v
77

88
## [Unreleased]
99

10+
## [3.1.14] - 2024-07-23
11+
12+
### Changed
13+
14+
- Obsoletes custom decompression handler in favor of native client capabilities at https://github.com/microsoft/kiota-dotnet/pull/303
15+
1016
## [3.1.12] - 2024-07-03
1117

1218
### Changed

src/Microsoft.Graph.Core/Microsoft.Graph.Core.csproj

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<AssemblyOriginatorKeyFile>35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
2222
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
2323
<!-- x-release-please-start-version -->
24-
<VersionPrefix>3.1.13</VersionPrefix>
24+
<VersionPrefix>3.1.14</VersionPrefix>
2525
<!-- x-release-please-end -->
2626
<!-- VersionPrefix minor version should not be set when the change comes from the generator. It will be updated automatically. -->
2727
<!-- VersionPrefix minor version must be manually set when making manual changes to code. -->
@@ -38,7 +38,7 @@
3838
<EnableNETAnalyzers>True</EnableNETAnalyzers>
3939
<PackageReadmeFile>README.md</PackageReadmeFile>
4040
<NoWarn>NU5048;NETSDK1202</NoWarn>
41-
<IsTrimmable>true</IsTrimmable>
41+
<IsTrimmable Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)','net5.0'))">true</IsTrimmable>
4242
</PropertyGroup>
4343
<!-- https://github.com/clairernovotny/DeterministicBuilds#deterministic-builds -->
4444
<PropertyGroup Condition="'$(TF_BUILD)' == 'true'">
@@ -62,15 +62,15 @@
6262
</None>
6363
</ItemGroup>
6464
<ItemGroup>
65-
<PackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="7.6.2" />
65+
<PackageReference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.0.1" />
6666
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
67-
<PackageReference Include="Microsoft.Kiota.Abstractions" Version="[1.9.6, 2.0.0)" />
68-
<PackageReference Include="Microsoft.Kiota.Authentication.Azure" Version="[1.1.7, 2.0.0)" />
69-
<PackageReference Include="Microsoft.Kiota.Serialization.Json" Version="[1.3.3, 2.0.0)" />
70-
<PackageReference Include="Microsoft.Kiota.Serialization.Text" Version="[1.2.2, 2.0.0)" />
71-
<PackageReference Include="Microsoft.Kiota.Serialization.Form" Version="[1.2.5, 2.0.0)" />
72-
<PackageReference Include="Microsoft.Kiota.Http.HttpClientLibrary" Version="[1.4.3, 2.0.0)" />
73-
<PackageReference Include="Microsoft.Kiota.Serialization.Multipart" Version="[1.1.5, 2.0.0)" />
67+
<PackageReference Include="Microsoft.Kiota.Abstractions" Version="1.9.11" />
68+
<PackageReference Include="Microsoft.Kiota.Authentication.Azure" Version="1.9.11" />
69+
<PackageReference Include="Microsoft.Kiota.Serialization.Json" Version="1.9.11" />
70+
<PackageReference Include="Microsoft.Kiota.Serialization.Text" Version="1.9.11" />
71+
<PackageReference Include="Microsoft.Kiota.Serialization.Form" Version="1.9.11" />
72+
<PackageReference Include="Microsoft.Kiota.Http.HttpClientLibrary" Version="1.9.11" />
73+
<PackageReference Include="Microsoft.Kiota.Serialization.Multipart" Version="1.9.11" />
7474
</ItemGroup>
7575
<ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
7676
<PackageReference Include="System.Net.Http.WinHttpHandler" Version="[6.0,9.0)" />

src/Microsoft.Graph.Core/Requests/GraphClientFactory.cs

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,6 @@ public static IList<DelegatingHandler> CreateDefaultHandlers(GraphClientOptions
117117
var handlers = KiotaClientFactory.CreateDefaultHandlers();
118118
handlers.Add(new GraphTelemetryHandler(graphClientOptions));// add the telemetry handler last.
119119

120-
// TODO remove this once https://github.com/microsoft/kiota/issues/598 is closed.
121-
handlers.Insert(0, new CompressionHandler());
122-
123120
return handlers;
124121
}
125122

@@ -173,20 +170,6 @@ internal static (HttpMessageHandler Pipeline, FeatureFlag FeatureFlags) CreatePi
173170
throw new ArgumentNullException(nameof(handlers), "DelegatingHandler array contains null item.");
174171
}
175172

176-
#if IOS || MACOS || MACCATALYST
177-
#if IOS || MACCATALYST
178-
// Skip CompressionHandler since NSUrlSessionHandler automatically handles decompression on iOS and macOS and it can't be turned off.
179-
// See issue https://github.com/microsoftgraph/msgraph-sdk-dotnet/issues/481 for more details.
180-
if (finalHandler.GetType().Equals(typeof(NSUrlSessionHandler)) && handler.GetType().Equals(typeof(CompressionHandler)))
181-
#elif MACOS
182-
if (finalHandler.GetType().Equals(typeof(Foundation.NSUrlSessionHandler)) && handler.GetType().Equals(typeof(CompressionHandler)))
183-
#endif
184-
{
185-
// Skip chaining of CompressionHandler.
186-
continue;
187-
}
188-
#endif
189-
190173
// Check for duplicate handler by type.
191174
if (!existingHandlerTypes.Add(handler.GetType()))
192175
{
@@ -220,17 +203,17 @@ internal static HttpMessageHandler GetNativePlatformHttpHandler(IWebProxy proxy
220203
#elif MACOS
221204
return new Foundation.NSUrlSessionHandler { AllowAutoRedirect = false };
222205
#elif ANDROID
223-
return new Xamarin.Android.Net.AndroidMessageHandler { Proxy = proxy, AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.None };
206+
return new Xamarin.Android.Net.AndroidMessageHandler { Proxy = proxy, AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.All };
224207
#elif NETFRAMEWORK
225208
// If custom proxy is passed, the WindowsProxyUsePolicy will need updating
226209
// https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Http.WinHttpHandler/src/System/Net/Http/WinHttpHandler.cs#L575
227210
var proxyPolicy = proxy != null ? WindowsProxyUsePolicy.UseCustomProxy : WindowsProxyUsePolicy.UseWinHttpProxy;
228-
return new WinHttpHandler { Proxy = proxy, AutomaticDecompression = DecompressionMethods.None , WindowsProxyUsePolicy = proxyPolicy, SendTimeout = Timeout.InfiniteTimeSpan, ReceiveDataTimeout = Timeout.InfiniteTimeSpan, ReceiveHeadersTimeout = Timeout.InfiniteTimeSpan };
211+
return new WinHttpHandler { Proxy = proxy, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate , WindowsProxyUsePolicy = proxyPolicy, SendTimeout = Timeout.InfiniteTimeSpan, ReceiveDataTimeout = Timeout.InfiniteTimeSpan, ReceiveHeadersTimeout = Timeout.InfiniteTimeSpan };
229212
#elif NET6_0_OR_GREATER
230213
//use resilient configs when we can https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0#alternatives-to-ihttpclientfactory-1
231-
return new SocketsHttpHandler { Proxy = proxy, AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.None, PooledConnectionLifetime = TimeSpan.FromMinutes(1)};
214+
return new SocketsHttpHandler { Proxy = proxy, AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.All, PooledConnectionLifetime = TimeSpan.FromMinutes(1)};
232215
#else
233-
return new HttpClientHandler { Proxy = proxy, AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.None };
216+
return new HttpClientHandler { Proxy = proxy, AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate };
234217
#endif
235218
}
236219

@@ -241,14 +224,16 @@ internal static HttpMessageHandler GetNativePlatformHttpHandler(IWebProxy proxy
241224
/// <returns>Delegating handler feature flag.</returns>
242225
private static FeatureFlag GetHandlerFeatureFlag(DelegatingHandler delegatingHandler)
243226
{
244-
if (delegatingHandler is CompressionHandler)
245-
return FeatureFlag.CompressionHandler;
246-
else if (delegatingHandler is RetryHandler)
247-
return FeatureFlag.RetryHandler;
248-
else if (delegatingHandler is RedirectHandler)
249-
return FeatureFlag.RedirectHandler;
250-
else
251-
return FeatureFlag.None;
227+
return delegatingHandler switch
228+
{
229+
// Type or member is obsolete
230+
#pragma warning disable CS0618 // Type or member is obsolete
231+
CompressionHandler => FeatureFlag.CompressionHandler,
232+
#pragma warning restore CS0618 // Type or member is obsolete
233+
RetryHandler => FeatureFlag.RetryHandler,
234+
RedirectHandler => FeatureFlag.RedirectHandler,
235+
_ => FeatureFlag.None
236+
};
252237
}
253238

254239
private static Uri DetermineBaseAddress(string nationalCloud, string version)

tests/Microsoft.Graph.DotnetCore.Core.Test/Requests/GraphClientFactoryTests.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,7 @@ public void Should_CreatePipeline_Without_CompressionHandler()
6969
[Fact]
7070
public void Should_CreatePipeline_Without_HttpMessageHandlerInput()
7171
{
72-
using CompressionHandler compressionHandler = (CompressionHandler)GraphClientFactory.CreatePipeline(handlers, new MockRedirectHandler());
73-
using UriReplacementHandler<UriReplacementHandlerOption> uriReplacementHandler = (UriReplacementHandler<UriReplacementHandlerOption>)compressionHandler.InnerHandler;
72+
using UriReplacementHandler<UriReplacementHandlerOption> uriReplacementHandler = (UriReplacementHandler<UriReplacementHandlerOption>)GraphClientFactory.CreatePipeline(handlers, new MockRedirectHandler());
7473
using RetryHandler retryHandler = (RetryHandler)uriReplacementHandler.InnerHandler;
7574
using RedirectHandler redirectHandler = (RedirectHandler)retryHandler.InnerHandler;
7675
using ParametersNameDecodingHandler odataQueryHandler = (ParametersNameDecodingHandler)redirectHandler.InnerHandler;
@@ -83,14 +82,12 @@ public void Should_CreatePipeline_Without_HttpMessageHandlerInput()
8382
Assert.NotNull(userAgentHandler);
8483
Assert.NotNull(headersInspectionHandler);
8584
Assert.NotNull(odataQueryHandler);
86-
Assert.NotNull(compressionHandler);
8785
Assert.NotNull(retryHandler);
8886
Assert.NotNull(redirectHandler);
8987
Assert.NotNull(innerMost);
9088
Assert.IsType<GraphTelemetryHandler>(telemetryHandler);
9189
Assert.IsType<ParametersNameDecodingHandler>(odataQueryHandler);
9290
Assert.IsType<HeadersInspectionHandler>(headersInspectionHandler);
93-
Assert.IsType<CompressionHandler>(compressionHandler);
9491
Assert.IsType<UserAgentHandler>(userAgentHandler);
9592
Assert.IsType<RetryHandler>(retryHandler);
9693
Assert.IsType<RedirectHandler>(redirectHandler);
@@ -101,8 +98,7 @@ public void Should_CreatePipeline_Without_HttpMessageHandlerInput()
10198
[Fact]
10299
public void CreatePipelineWithHttpMessageHandlerInput()
103100
{
104-
using CompressionHandler compressionHandler = (CompressionHandler)GraphClientFactory.CreatePipeline(handlers, new MockRedirectHandler());
105-
using UriReplacementHandler<UriReplacementHandlerOption> uriReplacementHandler = (UriReplacementHandler<UriReplacementHandlerOption>)compressionHandler.InnerHandler;
101+
using UriReplacementHandler<UriReplacementHandlerOption> uriReplacementHandler = (UriReplacementHandler<UriReplacementHandlerOption>)GraphClientFactory.CreatePipeline(handlers, new MockRedirectHandler());
106102
using RetryHandler retryHandler = (RetryHandler)uriReplacementHandler.InnerHandler;
107103
using RedirectHandler redirectHandler = (RedirectHandler)retryHandler.InnerHandler;
108104
using ParametersNameDecodingHandler odataQueryHandler = (ParametersNameDecodingHandler)redirectHandler.InnerHandler;
@@ -115,14 +111,12 @@ public void CreatePipelineWithHttpMessageHandlerInput()
115111
Assert.NotNull(userAgentHandler);
116112
Assert.NotNull(headersInspectionHandler);
117113
Assert.NotNull(odataQueryHandler);
118-
Assert.NotNull(compressionHandler);
119114
Assert.NotNull(retryHandler);
120115
Assert.NotNull(redirectHandler);
121116
Assert.NotNull(innerMost);
122117
Assert.IsType<GraphTelemetryHandler>(telemetryHandler);
123118
Assert.IsType<ParametersNameDecodingHandler>(odataQueryHandler);
124119
Assert.IsType<HeadersInspectionHandler>(headersInspectionHandler);
125-
Assert.IsType<CompressionHandler>(compressionHandler);
126120
Assert.IsType<RetryHandler>(retryHandler);
127121
Assert.IsType<UserAgentHandler>(userAgentHandler);
128122
Assert.IsType<RedirectHandler>(redirectHandler);
@@ -143,11 +137,11 @@ public void CreatePipelineWithoutPipeline()
143137
public void CreatePipeline_Should_Throw_Exception_With_Duplicate_Handlers()
144138
{
145139
var handlers = GraphClientFactory.CreateDefaultHandlers();
146-
handlers.Add(new CompressionHandler());
140+
handlers.Add(new GraphTelemetryHandler());
147141

148142
ArgumentException exception = Assert.Throws<ArgumentException>(() => GraphClientFactory.CreatePipeline(handlers));
149143

150-
Assert.Contains($"{typeof(CompressionHandler)} has a duplicate handler.", exception.Message);
144+
Assert.Contains($"{typeof(GraphTelemetryHandler)} has a duplicate handler.", exception.Message);
151145
}
152146

153147
[Fact]
@@ -281,7 +275,7 @@ public void CreateClient_WithInnerHandlerReference()
281275
[Fact]
282276
public void CreatePipelineWithFeatureFlags_Should_Set_FeatureFlag_For_Default_Handlers()
283277
{
284-
FeatureFlag expectedFlag = FeatureFlag.CompressionHandler | FeatureFlag.RetryHandler | FeatureFlag.RedirectHandler;
278+
FeatureFlag expectedFlag = FeatureFlag.RetryHandler | FeatureFlag.RedirectHandler;
285279
string expectedFlagHeaderValue = Enum.Format(typeof(FeatureFlag), expectedFlag, "x");
286280
var handlers = GraphClientFactory.CreateDefaultHandlers();
287281
var pipelineWithHandlers = GraphClientFactory.CreatePipelineWithFeatureFlags(handlers);
@@ -293,7 +287,7 @@ public void CreatePipelineWithFeatureFlags_Should_Set_FeatureFlag_For_Default_Ha
293287
[Fact]
294288
public void CreatePipelineWithFeatureFlags_Should_Set_FeatureFlag_For_Speficied_Handlers()
295289
{
296-
FeatureFlag expectedFlag = FeatureFlag.CompressionHandler | FeatureFlag.RetryHandler;
290+
FeatureFlag expectedFlag = FeatureFlag.RetryHandler;
297291
var handlers = GraphClientFactory.CreateDefaultHandlers();
298292
//Exclude the redirect handler for this test
299293
handlers = handlers.Where(handler => !handler.GetType().Equals(typeof(RedirectHandler))).ToList();

0 commit comments

Comments
 (0)