Skip to content

Commit 9fa405f

Browse files
committed
Allow using H/3 with WinHttpHandler
1 parent 598d5f7 commit 9fa405f

File tree

7 files changed

+207
-19
lines changed

7 files changed

+207
-19
lines changed

src/libraries/Common/src/Interop/Windows/WinHttp/Interop.winhttp_types.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ internal static partial class WinHttp
159159
public const uint WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL = 133;
160160
public const uint WINHTTP_OPTION_HTTP_PROTOCOL_USED = 134;
161161
public const uint WINHTTP_PROTOCOL_FLAG_HTTP2 = 0x1;
162+
public const uint WINHTTP_PROTOCOL_FLAG_HTTP3 = 0x2;
162163
public const uint WINHTTP_HTTP2_PLUS_CLIENT_CERT_FLAG = 0x1;
163164
public const uint WINHTTP_OPTION_DISABLE_STREAM_QUEUE = 139;
164165

src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Cancellation.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ public async Task PostAsync_CancelDuringRequestContentSend_TaskCanceledQuickly(b
3636
return;
3737
}
3838

39-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
39+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
4040
{
4141
return;
42-
}
42+
}*/
4343

4444
if (PlatformDetection.IsBrowser && LoopbackServerFactory.Version < HttpVersion20.Value)
4545
{
@@ -100,10 +100,10 @@ public async Task GetAsync_CancelDuringResponseHeadersReceived_TaskCanceledQuick
100100
return;
101101
}
102102

103-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
103+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
104104
{
105105
return;
106-
}
106+
}*/
107107

108108
using (HttpClient client = CreateHttpClient())
109109
{
@@ -208,10 +208,10 @@ public async Task GetAsync_CancelDuringResponseBodyReceived_Unbuffered_TaskCance
208208
return;
209209
}
210210

211-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
211+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
212212
{
213213
return;
214-
}
214+
}*/
215215

216216
using (HttpClient client = CreateHttpClient())
217217
{
@@ -276,10 +276,10 @@ await ValidateClientCancellationAsync(async () =>
276276
[SkipOnPlatform(TestPlatforms.Browser, "Browser doesn't have blocking synchronous Stream.ReadByte and so it waits for whole body")]
277277
public async Task GetAsync_CancelPendingRequests_DoesntCancelReadAsyncOnResponseStream(CancellationMode mode, bool copyToAsync)
278278
{
279-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
279+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
280280
{
281281
return;
282-
}
282+
}*/
283283

284284
using (HttpClient client = CreateHttpClient())
285285
{

src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Proxy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ public HttpClientHandler_Proxy_Test(ITestOutputHelper output) : base(output) { }
2929
[Fact]
3030
public async Task Dispose_HandlerWithProxy_ProxyNotDisposed()
3131
{
32-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
32+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
3333
{
3434
return;
35-
}
35+
}*/
3636

3737
var proxy = new TrackDisposalProxy();
3838

src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.ServerCertificates.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ public HttpClientHandler_ServerCertificates_Test(ITestOutputHelper output) : bas
4040
[Fact]
4141
public void Ctor_ExpectedDefaultValues()
4242
{
43-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
43+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
4444
{
4545
return;
46-
}
46+
}*/
4747

4848
using (HttpClientHandler handler = CreateHttpClientHandler())
4949
{
@@ -55,10 +55,10 @@ public void Ctor_ExpectedDefaultValues()
5555
[Fact]
5656
public void ServerCertificateCustomValidationCallback_SetGet_Roundtrips()
5757
{
58-
if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
58+
/*if (IsWinHttpHandler && UseVersion >= HttpVersion20.Value)
5959
{
6060
return;
61-
}
61+
}*/
6262

6363
using (HttpClientHandler handler = CreateHttpClientHandler())
6464
{

src/libraries/System.Net.Http.WinHttpHandler/src/System/Net/Http/WinHttpHandler.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,7 +1271,7 @@ private void SetRequestHandleOptions(WinHttpRequestState state)
12711271
SetRequestHandleClientCertificateOptions(state.RequestHandle, state.RequestMessage.RequestUri);
12721272
SetRequestHandleCredentialsOptions(state);
12731273
SetRequestHandleBufferingOptions(state.RequestHandle);
1274-
SetRequestHandleHttp2Options(state.RequestHandle, state.RequestMessage.Version);
1274+
SetRequestHandleHttpProtocolOptions(state.RequestHandle, state.RequestMessage.Version);
12751275
}
12761276

12771277
private void SetRequestHandleProxyOptions(WinHttpRequestState state)
@@ -1536,20 +1536,21 @@ private void SetRequestHandleBufferingOptions(SafeWinHttpHandle requestHandle)
15361536
SetWinHttpOption(requestHandle, Interop.WinHttp.WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE, ref optionData);
15371537
}
15381538

1539-
private void SetRequestHandleHttp2Options(SafeWinHttpHandle requestHandle, Version requestVersion)
1539+
private void SetRequestHandleHttpProtocolOptions(SafeWinHttpHandle requestHandle, Version requestVersion)
15401540
{
15411541
Debug.Assert(requestHandle != null);
1542-
uint optionData = (requestVersion == HttpVersion20) ? Interop.WinHttp.WINHTTP_PROTOCOL_FLAG_HTTP2 : 0;
1542+
uint optionData = (requestVersion == HttpVersion30) ? Interop.WinHttp.WINHTTP_PROTOCOL_FLAG_HTTP3 :
1543+
(requestVersion == HttpVersion20) ? Interop.WinHttp.WINHTTP_PROTOCOL_FLAG_HTTP2 : 0;
15431544
if (Interop.WinHttp.WinHttpSetOption(
15441545
requestHandle,
15451546
Interop.WinHttp.WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL,
15461547
ref optionData))
15471548
{
1548-
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"HTTP/2 option supported, setting to {optionData}");
1549+
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"HTTP/{requestVersion.Major} option supported, setting to {optionData}");
15491550
}
15501551
else
15511552
{
1552-
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, "HTTP/2 option not supported");
1553+
if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(this, $"HTTP/{requestVersion.Major} option not supported");
15531554
}
15541555
}
15551556

src/libraries/System.Net.Http.WinHttpHandler/tests/FunctionalTests/PlatformHandlerTest.cs

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,4 +361,184 @@ public sealed class PlatformHandler_ResponseStream_Http2_Test : ResponseStreamTe
361361

362362
public PlatformHandler_ResponseStream_Http2_Test(ITestOutputHelper output) : base(output) { }
363363
}
364+
365+
#if NET
366+
#if !WINHTTPHANDLER_TEST // [ActiveIssue("https://github.com/dotnet/runtime/issues/33930")]
367+
[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
368+
public sealed class PlatformHandlerTest_Cookies_Http3 : HttpClientHandlerTest_Cookies
369+
{
370+
protected override Version UseVersion => HttpVersion.Version30;
371+
372+
public PlatformHandlerTest_Cookies_Http3(ITestOutputHelper output) : base(output) { }
373+
}
374+
#endif
375+
376+
public sealed class PlatformHandler_HttpClientHandler_Asynchrony_Http3_Test : HttpClientHandler_Asynchrony_Test
377+
{
378+
protected override Version UseVersion => HttpVersion.Version30;
379+
380+
public PlatformHandler_HttpClientHandler_Asynchrony_Http3_Test(ITestOutputHelper output) : base(output) { }
381+
}
382+
383+
public sealed class PlatformHandler_HttpProtocol_Http3_Tests : HttpProtocolTests
384+
{
385+
protected override Version UseVersion => HttpVersion.Version30;
386+
387+
public PlatformHandler_HttpProtocol_Http3_Tests(ITestOutputHelper output) : base(output) { }
388+
}
389+
390+
public sealed class PlatformHandler_HttpProtocolTests_Http3_Dribble : HttpProtocolTests_Dribble
391+
{
392+
protected override Version UseVersion => HttpVersion.Version30;
393+
394+
public PlatformHandler_HttpProtocolTests_Http3_Dribble(ITestOutputHelper output) : base(output) { }
395+
}
396+
397+
public sealed class PlatformHandler_HttpClient_SelectedSites_Http3_Test : HttpClient_SelectedSites_Test
398+
{
399+
protected override Version UseVersion => HttpVersion.Version30;
400+
401+
public PlatformHandler_HttpClient_SelectedSites_Http3_Test(ITestOutputHelper output) : base(output) { }
402+
}
403+
404+
public sealed class PlatformHandler_HttpClientEKU_Http3_Test : HttpClientEKUTest
405+
{
406+
protected override Version UseVersion => HttpVersion.Version30;
407+
408+
public PlatformHandler_HttpClientEKU_Http3_Test(ITestOutputHelper output) : base(output) { }
409+
}
410+
411+
public sealed class PlatformHandler_HttpClientHandler_Decompression_Http3_Tests : HttpClientHandler_Decompression_Test
412+
{
413+
protected override Version UseVersion => HttpVersion.Version30;
414+
415+
public PlatformHandler_HttpClientHandler_Decompression_Http3_Tests(ITestOutputHelper output) : base(output) { }
416+
}
417+
418+
public sealed class PlatformHandler_HttpClientHandler_DangerousAcceptAllCertificatesValidator_Http3_Test : HttpClientHandler_DangerousAcceptAllCertificatesValidator_Test
419+
{
420+
protected override Version UseVersion => HttpVersion.Version30;
421+
422+
public PlatformHandler_HttpClientHandler_DangerousAcceptAllCertificatesValidator_Http3_Test(ITestOutputHelper output) : base(output) { }
423+
}
424+
425+
public sealed class PlatformHandler_HttpClientHandler_ClientCertificates_Http3_Test : HttpClientHandler_ClientCertificates_Test
426+
{
427+
protected override Version UseVersion => HttpVersion.Version30;
428+
429+
public PlatformHandler_HttpClientHandler_ClientCertificates_Http3_Test(ITestOutputHelper output) : base(output) { }
430+
}
431+
432+
public sealed class PlatformHandler_HttpClientHandler_DefaultProxyCredentials_Http3_Test : HttpClientHandler_DefaultProxyCredentials_Test
433+
{
434+
protected override Version UseVersion => HttpVersion.Version30;
435+
436+
public PlatformHandler_HttpClientHandler_DefaultProxyCredentials_Http3_Test(ITestOutputHelper output) : base(output) { }
437+
}
438+
439+
[SkipOnPlatform(TestPlatforms.Browser, "MaxConnectionsPerServer not supported on Browser")]
440+
public sealed class PlatformHandler_HttpClientHandler_MaxConnectionsPerServer_Http3_Test : HttpClientHandler_MaxConnectionsPerServer_Test
441+
{
442+
protected override Version UseVersion => HttpVersion.Version30;
443+
444+
public PlatformHandler_HttpClientHandler_MaxConnectionsPerServer_Http3_Test(ITestOutputHelper output) : base(output) { }
445+
}
446+
447+
public sealed class PlatformHandler_HttpClientHandler_ServerCertificates_Http3_Test : HttpClientHandler_ServerCertificates_Test
448+
{
449+
protected override Version UseVersion => HttpVersion.Version30;
450+
451+
public PlatformHandler_HttpClientHandler_ServerCertificates_Http3_Test(ITestOutputHelper output) : base(output)
452+
{
453+
AllowAllCertificates = false;
454+
}
455+
}
456+
457+
public sealed class PlatformHandler_PostScenario_Http3_Test : PostScenarioTest
458+
{
459+
protected override Version UseVersion => HttpVersion.Version30;
460+
461+
public PlatformHandler_PostScenario_Http3_Test(ITestOutputHelper output) : base(output) { }
462+
}
463+
464+
public sealed class PlatformHandler_HttpClientHandler_SslProtocols_Http3_Test : HttpClientHandler_SslProtocols_Test
465+
{
466+
protected override Version UseVersion => HttpVersion.Version30;
467+
468+
public PlatformHandler_HttpClientHandler_SslProtocols_Http3_Test(ITestOutputHelper output) : base(output) { }
469+
}
470+
471+
public sealed class PlatformHandler_HttpClientHandler_Proxy_Http3_Test : HttpClientHandler_Proxy_Test
472+
{
473+
protected override Version UseVersion => HttpVersion.Version30;
474+
475+
public PlatformHandler_HttpClientHandler_Proxy_Http3_Test(ITestOutputHelper output) : base(output) { }
476+
}
477+
478+
[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
479+
public sealed class PlatformHandler_HttpClientHandler_Http3_Test : HttpClientHandlerTest
480+
{
481+
protected override Version UseVersion => HttpVersion.Version30;
482+
483+
public PlatformHandler_HttpClientHandler_Http3_Test(ITestOutputHelper output) : base(output) { }
484+
}
485+
486+
public sealed class PlatformHandlerTest_AutoRedirect_Http3 : HttpClientHandlerTest_AutoRedirect
487+
{
488+
protected override Version UseVersion => HttpVersion.Version30;
489+
490+
public PlatformHandlerTest_AutoRedirect_Http3(ITestOutputHelper output) : base(output) { }
491+
}
492+
493+
public sealed class PlatformHandler_DefaultCredentials_Http3_Test : DefaultCredentialsTest
494+
{
495+
protected override Version UseVersion => HttpVersion.Version30;
496+
497+
public PlatformHandler_DefaultCredentials_Http3_Test(ITestOutputHelper output) : base(output) { }
498+
}
499+
500+
public sealed class PlatformHandler_IdnaProtocol_Http3_Tests : IdnaProtocolTests
501+
{
502+
protected override Version UseVersion => HttpVersion.Version30;
503+
504+
public PlatformHandler_IdnaProtocol_Http3_Tests(ITestOutputHelper output) : base(output) { }
505+
// WinHttp on Win7 does not support IDNA
506+
protected override bool SupportsIdna => !PlatformDetection.IsWindows7;
507+
}
508+
509+
public sealed class PlatformHandlerTest_Cookies_Http11_Http3 : HttpClientHandlerTest_Cookies_Http11
510+
{
511+
protected override Version UseVersion => HttpVersion.Version30;
512+
513+
public PlatformHandlerTest_Cookies_Http11_Http3(ITestOutputHelper output) : base(output) { }
514+
}
515+
516+
[ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.IsWindows10Version1607OrGreater))]
517+
public sealed class PlatformHandler_HttpClientHandler_MaxResponseHeadersLength_Http3_Test : HttpClientHandler_MaxResponseHeadersLength_Test
518+
{
519+
protected override Version UseVersion => HttpVersion.Version30;
520+
521+
public PlatformHandler_HttpClientHandler_MaxResponseHeadersLength_Http3_Test(ITestOutputHelper output) : base(output) { }
522+
}
523+
524+
public sealed class PlatformHandler_HttpClientHandler_Cancellation_Http3_Test : HttpClientHandler_Cancellation_Test
525+
{
526+
protected override Version UseVersion => HttpVersion.Version30;
527+
528+
public PlatformHandler_HttpClientHandler_Cancellation_Http3_Test(ITestOutputHelper output) : base(output) { }
529+
}
530+
531+
public sealed class PlatformHandler_HttpClientHandler_Authentication_Http3_Test : HttpClientHandler_Authentication_Test
532+
{
533+
protected override Version UseVersion => HttpVersion.Version30;
534+
535+
public PlatformHandler_HttpClientHandler_Authentication_Http3_Test(ITestOutputHelper output) : base(output) { }
536+
}
537+
public sealed class PlatformHandler_ResponseStream_Http3_Test : ResponseStreamTest
538+
{
539+
protected override Version UseVersion => HttpVersion.Version30;
540+
541+
public PlatformHandler_ResponseStream_Http3_Test(ITestOutputHelper output) : base(output) { }
542+
}
543+
#endif
364544
}

src/libraries/System.Net.Http.WinHttpHandler/tests/FunctionalTests/System.Net.Http.WinHttpHandler.Functional.Tests.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@
148148
<ProjectReference Include="..\..\src\System.Net.Http.WinHttpHandler.csproj" />
149149
</ItemGroup>
150150
<ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp'">
151+
<Compile Include="$(CommonTestPath)System\Net\Http\Http3LoopbackServer.cs"
152+
Link="Common\System\Net\Http\Http3LoopbackServer.cs" />
153+
<Compile Include="$(CommonTestPath)System\Net\Http\Http3LoopbackConnection.cs"
154+
Link="Common\System\Net\Http\Http3LoopbackConnection.cs" />
155+
<Compile Include="$(CommonTestPath)System\Net\Http\Http3LoopbackStream.cs"
156+
Link="Common\System\Net\Http\Http3LoopbackStream.cs" />
151157
<ProjectReference Include="$(LibrariesProjectRoot)System.DirectoryServices.Protocols\src\System.DirectoryServices.Protocols.csproj" />
152158
</ItemGroup>
153159
<ItemGroup Condition="'$(TargetFrameworkIdentifier)' == '.NETFramework'">

0 commit comments

Comments
 (0)