Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,10 @@ internal static partial class WinHttp
public const uint WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL = 133;
public const uint WINHTTP_OPTION_HTTP_PROTOCOL_USED = 134;
public const uint WINHTTP_PROTOCOL_FLAG_HTTP2 = 0x1;
public const uint WINHTTP_PROTOCOL_FLAG_HTTP3 = 0x2;
public const uint WINHTTP_HTTP2_PLUS_CLIENT_CERT_FLAG = 0x1;
public const uint WINHTTP_OPTION_DISABLE_STREAM_QUEUE = 139;
public const uint WINHTTP_OPTION_HTTP_PROTOCOL_REQUIRED = 145;

public const uint WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET = 114;
public const uint WINHTTP_OPTION_WEB_SOCKET_CLOSE_TIMEOUT = 115;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ public async Task PostAsync_CancelDuringRequestContentSend_TaskCanceledQuickly(b
return;
}

if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

if (PlatformDetection.IsBrowser && LoopbackServerFactory.Version < HttpVersion20.Value)
{
Expand Down Expand Up @@ -100,10 +100,10 @@ public async Task GetAsync_CancelDuringResponseHeadersReceived_TaskCanceledQuick
return;
}

if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

using (HttpClient client = CreateHttpClient())
{
Expand Down Expand Up @@ -208,10 +208,10 @@ public async Task GetAsync_CancelDuringResponseBodyReceived_Unbuffered_TaskCance
return;
}

if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

using (HttpClient client = CreateHttpClient())
{
Expand Down Expand Up @@ -271,10 +271,10 @@ await ValidateClientCancellationAsync(async () =>
[SkipOnPlatform(TestPlatforms.Browser, "Browser doesn't have blocking synchronous Stream.ReadByte and so it waits for whole body")]
public async Task GetAsync_CancelPendingRequests_DoesntCancelReadAsyncOnResponseStream(CancellationMode mode, bool copyToAsync)
{
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

using (HttpClient client = CreateHttpClient())
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ await LoopbackServer.CreateServerAsync(async (server, url) =>
break;
}
}

Assert.True(acceptEncodingValid, "Accept-Encoding missing or invalid");

using (HttpResponseMessage response = await clientTask)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@ public HttpClientHandler_Proxy_Test(ITestOutputHelper output) : base(output) { }
[Fact]
public async Task Dispose_HandlerWithProxy_ProxyNotDisposed()
{
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}

var proxy = new TrackDisposalProxy();

await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ public HttpClientHandler_ServerCertificates_Test(ITestOutputHelper output) : bas
[Fact]
public void Ctor_ExpectedDefaultValues()
{
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

using (HttpClientHandler handler = CreateHttpClientHandler())
{
Expand All @@ -55,10 +55,10 @@ public void Ctor_ExpectedDefaultValues()
[Fact]
public void ServerCertificateCustomValidationCallback_SetGet_Roundtrips()
{
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

using (HttpClientHandler handler = CreateHttpClientHandler())
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,14 @@ private async Task StartRequestAsync(WinHttpRequestState state)
{
httpVersion = "HTTP/1.1";
}
else if (state.RequestMessage.Version == HttpVersion20)
{
httpVersion = "HTTP/2.0";
}
else if (state.RequestMessage.Version == HttpVersion30)
{
httpVersion = "HTTP/3.0";
}

OpenRequestHandle(state, connectHandle, httpVersion, out WinHttpChunkMode chunkedModeForSend, out SafeWinHttpHandle requestHandle);
state.RequestHandle = requestHandle;
Expand Down Expand Up @@ -1269,7 +1277,13 @@ private void SetRequestHandleOptions(WinHttpRequestState state)
SetRequestHandleClientCertificateOptions(state.RequestHandle, state.RequestMessage.RequestUri);
SetRequestHandleCredentialsOptions(state);
SetRequestHandleBufferingOptions(state.RequestHandle);
SetRequestHandleHttp2Options(state.RequestHandle, state.RequestMessage.Version);
bool forceVersion =
#if NET
state.RequestMessage.VersionPolicy != HttpVersionPolicy.RequestVersionOrLower;
#else
false;
#endif
SetRequestHandleHttpProtocolOptions(state.RequestHandle, state.RequestMessage.Version, forceVersion);
}

private static void SetRequestHandleProxyOptions(WinHttpRequestState state)
Expand Down Expand Up @@ -1509,20 +1523,38 @@ private void SetRequestHandleBufferingOptions(SafeWinHttpHandle requestHandle)
SetWinHttpOption(requestHandle, Interop.WinHttp.WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE, ref optionData);
}

private void SetRequestHandleHttp2Options(SafeWinHttpHandle requestHandle, Version requestVersion)
private void SetRequestHandleHttpProtocolOptions(SafeWinHttpHandle requestHandle, Version requestVersion, bool forceVersion)
{
Debug.Assert(requestHandle != null);
uint optionData = (requestVersion == HttpVersion20) ? Interop.WinHttp.WINHTTP_PROTOCOL_FLAG_HTTP2 : 0;
uint optionData = (requestVersion == HttpVersion30) ? Interop.WinHttp.WINHTTP_PROTOCOL_FLAG_HTTP3 :
(requestVersion == HttpVersion20) ? Interop.WinHttp.WINHTTP_PROTOCOL_FLAG_HTTP2 : 0;
if (Interop.WinHttp.WinHttpSetOption(
requestHandle,
Interop.WinHttp.WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL,
ref optionData))
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"HTTP/2 option supported, setting to {optionData}");
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"HTTP/{requestVersion.Major} option supported, setting to {optionData}");
}
else
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, "HTTP/2 option not supported");
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"HTTP/{requestVersion.Major} option not supported");
return;
}

if (optionData != 0 && forceVersion)
{
uint protocolRequired = 1;
if (Interop.WinHttp.WinHttpSetOption(
requestHandle,
Interop.WinHttp.WINHTTP_OPTION_HTTP_PROTOCOL_REQUIRED,
ref protocolRequired))
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, "HTTP protocol required option set");
}
else
{
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, "HTTP protocol required option not supported");
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,12 @@ protected static LoopbackServerFactory GetFactoryForVersion(Version useVersion)
{
return useVersion.Major switch
{
1 => Http11LoopbackServerFactory.Singleton,
2 => Http2LoopbackServerFactory.Singleton,
_ => Http11LoopbackServerFactory.Singleton
#if NET
3 => Http3LoopbackServerFactory.Singleton,
#endif
_ => throw new InvalidOperationException($"Unexpected HTTP version: {useVersion}")
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,170 +191,32 @@ public PlatformHandlerTest_Cookies_Http2(ITestOutputHelper output) : base(output
}
#endif

public sealed class PlatformHandler_HttpClientHandler_Asynchrony_Http2_Test : HttpClientHandler_Asynchrony_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_Asynchrony_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpProtocol_Http2_Tests : HttpProtocolTests
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpProtocol_Http2_Tests(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpProtocolTests_Http2_Dribble : HttpProtocolTests_Dribble
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpProtocolTests_Http2_Dribble(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClient_SelectedSites_Http2_Test : HttpClient_SelectedSites_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClient_SelectedSites_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientEKU_Http2_Test : HttpClientEKUTest
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientEKU_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_Decompression_Http2_Tests : HttpClientHandler_Decompression_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_Decompression_Http2_Tests(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_DangerousAcceptAllCertificatesValidator_Http2_Test : HttpClientHandler_DangerousAcceptAllCertificatesValidator_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_DangerousAcceptAllCertificatesValidator_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_ClientCertificates_Http2_Test : HttpClientHandler_ClientCertificates_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_ClientCertificates_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_DefaultProxyCredentials_Http2_Test : HttpClientHandler_DefaultProxyCredentials_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_DefaultProxyCredentials_Http2_Test(ITestOutputHelper output) : base(output) { }
}

[SkipOnPlatform(TestPlatforms.Browser, "MaxConnectionsPerServer not supported on Browser")]
public sealed class PlatformHandler_HttpClientHandler_MaxConnectionsPerServer_Http2_Test : HttpClientHandler_MaxConnectionsPerServer_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_MaxConnectionsPerServer_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_ServerCertificates_Http2_Test : HttpClientHandler_ServerCertificates_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_ServerCertificates_Http2_Test(ITestOutputHelper output) : base(output)
{
AllowAllCertificates = false;
}
}

public sealed class PlatformHandler_PostScenario_Http2_Test : PostScenarioTest
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_PostScenario_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_SslProtocols_Http2_Test : HttpClientHandler_SslProtocols_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_SslProtocols_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_Proxy_Http2_Test : HttpClientHandler_Proxy_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_Proxy_Http2_Test(ITestOutputHelper output) : base(output) { }
}

[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
public sealed class PlatformHandler_HttpClientHandler_Http2_Test : HttpClientHandlerTest
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_Http2_Test(ITestOutputHelper output) : base(output) { }
}
#endif

public sealed class PlatformHandlerTest_AutoRedirect_Http2 : HttpClientHandlerTest_AutoRedirect
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandlerTest_AutoRedirect_Http2(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_DefaultCredentials_Http2_Test : DefaultCredentialsTest
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_DefaultCredentials_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_IdnaProtocol_Http2_Tests : IdnaProtocolTests
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_IdnaProtocol_Http2_Tests(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandlerTest_Cookies_Http11_Http2 : HttpClientHandlerTest_Cookies_Http11
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandlerTest_Cookies_Http11_Http2(ITestOutputHelper output) : base(output) { }
}

#if NET
#if !WINHTTPHANDLER_TEST // [ActiveIssue("https://github.com/dotnet/runtime/issues/33930")]
[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
public sealed class PlatformHandler_HttpClientHandler_MaxResponseHeadersLength_Http2_Test : HttpClientHandler_MaxResponseHeadersLength_Test
public sealed class PlatformHandlerTest_Cookies_Http3 : HttpClientHandlerTest_Cookies
{
protected override Version UseVersion => HttpVersion20.Value;
protected override Version UseVersion => HttpVersion.Version30;

public PlatformHandler_HttpClientHandler_MaxResponseHeadersLength_Http2_Test(ITestOutputHelper output) : base(output) { }
}

public sealed class PlatformHandler_HttpClientHandler_Cancellation_Http2_Test : HttpClientHandler_Cancellation_Test
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_HttpClientHandler_Cancellation_Http2_Test(ITestOutputHelper output) : base(output) { }
public PlatformHandlerTest_Cookies_Http3(ITestOutputHelper output) : base(output) { }
}
#endif

public sealed class PlatformHandler_HttpClientHandler_Authentication_Http2_Test : HttpClientHandler_Authentication_Test
[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
public sealed class PlatformHandler_HttpClientHandler_Http3_Test : HttpClientHandlerTest
{
protected override Version UseVersion => HttpVersion20.Value;
protected override Version UseVersion => HttpVersion.Version30;

public PlatformHandler_HttpClientHandler_Authentication_Http2_Test(ITestOutputHelper output) : base(output) { }
public PlatformHandler_HttpClientHandler_Http3_Test(ITestOutputHelper output) : base(output) { }
}
#endif
public sealed class PlatformHandler_ResponseStream_Http2_Test : ResponseStreamTest
{
protected override Version UseVersion => HttpVersion20.Value;

public PlatformHandler_ResponseStream_Http2_Test(ITestOutputHelper output) : base(output) { }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@
<ProjectReference Include="..\..\src\System.Net.Http.WinHttpHandler.csproj" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp'">
<Compile Include="$(CommonTestPath)System\Net\Http\Http3LoopbackServer.cs"
Link="Common\System\Net\Http\Http3LoopbackServer.cs" />
<Compile Include="$(CommonTestPath)System\Net\Http\Http3LoopbackConnection.cs"
Link="Common\System\Net\Http\Http3LoopbackConnection.cs" />
<Compile Include="$(CommonTestPath)System\Net\Http\Http3LoopbackStream.cs"
Link="Common\System\Net\Http\Http3LoopbackStream.cs" />
<ProjectReference Include="$(LibrariesProjectRoot)System.DirectoryServices.Protocols\src\System.DirectoryServices.Protocols.csproj" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'">
Expand Down
Loading
Loading