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 @@ -29,10 +29,10 @@ public HttpClientHandler_Proxy_Test(ITestOutputHelper output) : base(output) { }
[Fact]
public async Task Dispose_HandlerWithProxy_ProxyNotDisposed()
{
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
{
return;
}
}*/

var proxy = new TrackDisposalProxy();

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,7 @@ private void SetRequestHandleOptions(WinHttpRequestState state)
SetRequestHandleClientCertificateOptions(state.RequestHandle, state.RequestMessage.RequestUri);
SetRequestHandleCredentialsOptions(state);
SetRequestHandleBufferingOptions(state.RequestHandle);
SetRequestHandleHttp2Options(state.RequestHandle, state.RequestMessage.Version);
SetRequestHandleHttpProtocolOptions(state.RequestHandle, state.RequestMessage.Version);
}

private static void SetRequestHandleProxyOptions(WinHttpRequestState state)
Expand Down Expand Up @@ -1509,21 +1517,35 @@ 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)
{
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)
{
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 not supported");
}
}*/
}

private void SetWinHttpOption(SafeWinHttpHandle handle, uint option, ref uint optionData)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,4 +361,184 @@ public sealed class PlatformHandler_ResponseStream_Http2_Test : ResponseStreamTe

public PlatformHandler_ResponseStream_Http2_Test(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 PlatformHandlerTest_Cookies_Http3 : HttpClientHandlerTest_Cookies
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_Asynchrony_Http3_Test : HttpClientHandler_Asynchrony_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpProtocol_Http3_Tests : HttpProtocolTests
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpProtocolTests_Http3_Dribble : HttpProtocolTests_Dribble
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClient_SelectedSites_Http3_Test : HttpClient_SelectedSites_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientEKU_Http3_Test : HttpClientEKUTest
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_Decompression_Http3_Tests : HttpClientHandler_Decompression_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_DangerousAcceptAllCertificatesValidator_Http3_Test : HttpClientHandler_DangerousAcceptAllCertificatesValidator_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_ClientCertificates_Http3_Test : HttpClientHandler_ClientCertificates_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_DefaultProxyCredentials_Http3_Test : HttpClientHandler_DefaultProxyCredentials_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

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

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

public sealed class PlatformHandler_HttpClientHandler_ServerCertificates_Http3_Test : HttpClientHandler_ServerCertificates_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_PostScenario_Http3_Test : PostScenarioTest
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_SslProtocols_Http3_Test : HttpClientHandler_SslProtocols_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_Proxy_Http3_Test : HttpClientHandler_Proxy_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

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

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

public sealed class PlatformHandlerTest_AutoRedirect_Http3 : HttpClientHandlerTest_AutoRedirect
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_DefaultCredentials_Http3_Test : DefaultCredentialsTest
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_IdnaProtocol_Http3_Tests : IdnaProtocolTests
{
protected override Version UseVersion => HttpVersion.Version30;

public PlatformHandler_IdnaProtocol_Http3_Tests(ITestOutputHelper output) : base(output) { }
// WinHttp on Win7 does not support IDNA
protected override bool SupportsIdna => !PlatformDetection.IsWindows7;
}

public sealed class PlatformHandlerTest_Cookies_Http11_Http3 : HttpClientHandlerTest_Cookies_Http11
{
protected override Version UseVersion => HttpVersion.Version30;

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

[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
public sealed class PlatformHandler_HttpClientHandler_MaxResponseHeadersLength_Http3_Test : HttpClientHandler_MaxResponseHeadersLength_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_Cancellation_Http3_Test : HttpClientHandler_Cancellation_Test
{
protected override Version UseVersion => HttpVersion.Version30;

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

public sealed class PlatformHandler_HttpClientHandler_Authentication_Http3_Test : HttpClientHandler_Authentication_Test
{
protected override Version UseVersion => HttpVersion.Version30;

public PlatformHandler_HttpClientHandler_Authentication_Http3_Test(ITestOutputHelper output) : base(output) { }
}
public sealed class PlatformHandler_ResponseStream_Http3_Test : ResponseStreamTest
{
protected override Version UseVersion => HttpVersion.Version30;

public PlatformHandler_ResponseStream_Http3_Test(ITestOutputHelper output) : base(output) { }
}
#endif
}
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