Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[HTTP/3] Reenable interop tests #56867

Merged
merged 3 commits into from
Aug 6, 2021
Merged
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 @@ -1142,6 +1142,11 @@ private async ValueTask<bool> ReadNextDataFrameAsync(HttpResponseMessage respons
switch (frameType)
{
case Http3FrameType.Data:
// Ignore DATA frames with 0 length.
if (payloadLength == 0)
{
continue;
}
_responseDataPayloadRemaining = payloadLength;
return true;
case Http3FrameType.Headers:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,6 @@ public async Task ServerCertificateCustomValidationCallback_Succeeds()
[OuterLoop]
[ConditionalTheory(nameof(IsMsQuicSupported))]
[MemberData(nameof(InteropUris))]
[ActiveIssue("https://github.com/dotnet/runtime/issues/54726")]
public async Task Public_Interop_ExactVersion_Success(string uri)
{
if (UseQuicImplementationProvider == QuicImplementationProviders.Mock)
Expand All @@ -402,18 +401,46 @@ public async Task Public_Interop_ExactVersion_Success(string uri)
Assert.Equal(3, response.Version.Major);
}

[OuterLoop]
[ConditionalTheory(nameof(IsMsQuicSupported))]
[MemberData(nameof(InteropUrisWithContent))]
public async Task Public_Interop_ExactVersion_BufferContent_Success(string uri)
{
if (UseQuicImplementationProvider == QuicImplementationProviders.Mock)
{
return;
}

using HttpClient client = CreateHttpClient();
using HttpRequestMessage request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri(uri, UriKind.Absolute),
Version = HttpVersion.Version30,
VersionPolicy = HttpVersionPolicy.RequestVersionExact
};
using HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead).WaitAsync(TimeSpan.FromSeconds(20));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we validate the actual content too? I don't know how these endpoints work. If they have fixed content that will never change, seems like we could validate that we receive the correct content.

Or if not, can we at least validate that the content exists, i.e. we receive > 0 bytes?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a check for non-empty content.
I don't think we should check for a particular content value since these are external and can change any time.


Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal(3, response.Version.Major);

var content = await response.Content.ReadAsStringAsync();
Assert.NotEmpty(content);
}

[OuterLoop]
[ConditionalTheory(nameof(IsMsQuicSupported))]
[MemberData(nameof(InteropUris))]
[ActiveIssue("https://github.com/dotnet/runtime/issues/54726")]
public async Task Public_Interop_Upgrade_Success(string uri)
{
if (UseQuicImplementationProvider == QuicImplementationProviders.Mock)
{
return;
}

using HttpClient client = CreateHttpClient();
// Create the handler manually without passing in useVersion = Http3 to avoid using VersionHttpClientHandler,
// because it overrides VersionPolicy on each request with RequestVersionExact (bypassing Alt-Svc code path completely).
using HttpClient client = CreateHttpClient(CreateHttpClientHandler(quicImplementationProvider: UseQuicImplementationProvider));

// First request uses HTTP/1 or HTTP/2 and receives an Alt-Svc either by header or (with HTTP/2) by frame.

Expand Down Expand Up @@ -443,7 +470,7 @@ public async Task Public_Interop_Upgrade_Success(string uri)
using HttpResponseMessage responseB = await client.SendAsync(requestB).WaitAsync(TimeSpan.FromSeconds(20));

Assert.Equal(HttpStatusCode.OK, responseB.StatusCode);
Assert.NotEqual(3, responseB.Version.Major);
Assert.Equal(3, responseB.Version.Major);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How did this test ever work?? :)

}
}

Expand Down Expand Up @@ -754,14 +781,26 @@ private SslApplicationProtocol ExtractMsQuicNegotiatedAlpn(Http3LoopbackConnecti

/// <summary>
/// These are public interop test servers for various QUIC and HTTP/3 implementations,
/// taken from https://github.com/quicwg/base-drafts/wiki/Implementations
/// taken from https://github.com/quicwg/base-drafts/wiki/Implementations and https://bagder.github.io/HTTP3-test/.
/// </summary>
public static TheoryData<string> InteropUris() =>
new TheoryData<string>
{
{ "https://quic.rocks:4433/" }, // Chromium
{ "https://http3-test.litespeedtech.com:4433/" }, // LiteSpeed
{ "https://quic.tech:8443/" } // Cloudflare
{ "https://www.litespeedtech.com/" }, // LiteSpeed
{ "https://quic.tech:8443/" }, // Cloudflare
{ "https://quic.aiortc.org:443/" }, // aioquic
{ "https://h2o.examp1e.net/" } // h2o/quicly
};

/// <summary>
/// These are public interop test servers for various QUIC and HTTP/3 implementations,
/// taken from https://github.com/quicwg/base-drafts/wiki/Implementations and https://bagder.github.io/HTTP3-test/.
/// </summary>
public static TheoryData<string> InteropUrisWithContent() =>
new TheoryData<string>
{
{ "https://cloudflare-quic.com/" }, // Cloudflare with content
{ "https://pgjones.dev/" }, // aioquic with content
};
}
}