Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Add some rng
  • Loading branch information
MihaZupan committed Aug 18, 2022
commit ab7ff63184cc32d11a4e5a95aaf9b483cb08c8aa
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public void ValidValue_SetGet_Roundtrips(int validValue)
[Fact]
public async Task SetAfterUse_Throws()
{
for (int repeat = 0; repeat <= (UseVersion.Major == 3 ? 100 : 1); repeat++)
for (int repeat = 0; repeat <= (UseVersion.Major == 3 ? 50 : 1); repeat++)
{
await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
{
Expand All @@ -64,94 +64,127 @@ await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
}
}

public static IEnumerable<object[]> LargeSingleHeader_ThrowsException_MemberData()
{
object[][] options = new[]
{
new object[] { 1 },
new object[] { 2 },
new object[] { 15 },
};

var rng = new Random();
int count = options.Length * 50;

for (int i = 0; i < count; i++)
{
yield return options[rng.Next(options.Length)];
}
}

[Theory]
[InlineData(1)]
[InlineData(15)]
[MemberData(nameof(LargeSingleHeader_ThrowsException_MemberData))]
public async Task LargeSingleHeader_ThrowsException(int maxResponseHeadersLength)
{
for (int repeat = 0; repeat <= (UseVersion.Major == 3 ? 100 : 1); repeat++)
if (UseVersion.Major != 3) return;

using HttpClientHandler handler = CreateHttpClientHandler();
handler.MaxResponseHeadersLength = maxResponseHeadersLength;

await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
{
using HttpClientHandler handler = CreateHttpClientHandler();
handler.MaxResponseHeadersLength = maxResponseHeadersLength;
using HttpClient client = CreateHttpClient(handler);

await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
Exception e = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(uri)).WaitAsync(TestHelper.PassingTestTimeout);
if (!IsWinHttpHandler)
{
using HttpClient client = CreateHttpClient(handler);
Assert.Contains((handler.MaxResponseHeadersLength * 1024).ToString(), e.ToString());
}
},
async server =>
{
HttpHeaderData[] headers = new[] { new HttpHeaderData("Foo", new string('a', handler.MaxResponseHeadersLength * 1024)) };

Exception e = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(uri)).WaitAsync(TestHelper.PassingTestTimeout);
if (!IsWinHttpHandler)
{
Assert.Contains((handler.MaxResponseHeadersLength * 1024).ToString(), e.ToString());
}
},
async server =>
try
{
await server.HandleRequestAsync(headers: headers).WaitAsync(TestHelper.PassingTestTimeout);
}
catch (Exception ex)
{
HttpHeaderData[] headers = new[] { new HttpHeaderData("Foo", new string('a', handler.MaxResponseHeadersLength * 1024)) };
_output.WriteLine($"Ignored exception:{Environment.NewLine}{ex}");
}
});
}

try
{
await server.HandleRequestAsync(headers: headers).WaitAsync(TestHelper.PassingTestTimeout);
}
catch (Exception ex)
{
_output.WriteLine($"Ignored exception:{Environment.NewLine}{ex}");
}
});
public static IEnumerable<object[]> ThresholdExceeded_ThrowsException_MemberData()
{
object[][] options = new[]
{
new object[] { null, 63 * 1024 },
new object[] { null, 65 * 1024 },
new object[] { 1, 100 },
new object[] { 1, 1024 },
new object[] { 2, 1100 },
new object[] { 2, 2048 },
new object[] { int.MaxValue / 800, 100 * 1024 },
};

var rng = new Random();
int count = options.Length * 50;

for (int i = 0; i < count; i++)
{
yield return options[rng.Next(options.Length)];
}
}

[Theory]
[InlineData(null, 63 * 1024)]
[InlineData(null, 65 * 1024)]
[InlineData(1, 100)]
[InlineData(1, 1024)]
[InlineData(int.MaxValue / 800, 100 * 1024)] // Capped at int.MaxValue
[MemberData(nameof(ThresholdExceeded_ThrowsException_MemberData))]
public async Task ThresholdExceeded_ThrowsException(int? maxResponseHeadersLength, int headersLengthEstimate)
{
for (int repeat = 0; repeat <= (UseVersion.Major == 3 ? 100 : 1); repeat++)
if (UseVersion.Major != 3) return;

await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
{
await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
{
using HttpClientHandler handler = CreateHttpClientHandler();
using HttpClientHandler handler = CreateHttpClientHandler();

if (maxResponseHeadersLength.HasValue)
{
handler.MaxResponseHeadersLength = maxResponseHeadersLength.Value;
}
if (maxResponseHeadersLength.HasValue)
{
handler.MaxResponseHeadersLength = maxResponseHeadersLength.Value;
}

using HttpClient client = CreateHttpClient(handler);
using HttpClient client = CreateHttpClient(handler);

if (headersLengthEstimate < handler.MaxResponseHeadersLength * 1024L)
{
await client.GetAsync(uri).WaitAsync(TestHelper.PassingTestTimeout);
}
else
{
Exception e = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(uri)).WaitAsync(TestHelper.PassingTestTimeout);
if (!IsWinHttpHandler)
{
Assert.Contains((handler.MaxResponseHeadersLength * 1024).ToString(), e.ToString());
}
}
},
async server =>
if (headersLengthEstimate < handler.MaxResponseHeadersLength * 1024L)
{
await client.GetAsync(uri).WaitAsync(TestHelper.PassingTestTimeout);
}
else
{
var headers = new List<HttpHeaderData>();
for (int i = 0; i <= headersLengthEstimate / 500; i++)
Exception e = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(uri)).WaitAsync(TestHelper.PassingTestTimeout);
if (!IsWinHttpHandler)
{
headers.Add(new HttpHeaderData($"Custom-{i}", new string('a', 480)));
Assert.Contains((handler.MaxResponseHeadersLength * 1024).ToString(), e.ToString());
}
}
},
async server =>
{
var headers = new List<HttpHeaderData>();
for (int i = 0; i <= headersLengthEstimate / 500; i++)
{
headers.Add(new HttpHeaderData($"Custom-{i}", new string('a', 480)));
}

try
{
await server.HandleRequestAsync(headers: headers).WaitAsync(TestHelper.PassingTestTimeout);
}
catch (Exception ex)
{
_output.WriteLine($"Ignored exception:{Environment.NewLine}{ex}");
}
});
}
try
{
await server.HandleRequestAsync(headers: headers).WaitAsync(TestHelper.PassingTestTimeout);
}
catch (Exception ex)
{
_output.WriteLine($"Ignored exception:{Environment.NewLine}{ex}");
}
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1246,49 +1246,63 @@ public sealed class SocketsHttpHandler_HttpClientHandler_MaxResponseHeadersLengt
public SocketsHttpHandler_HttpClientHandler_MaxResponseHeadersLength_Http3(ITestOutputHelper output) : base(output) { }
protected override Version UseVersion => HttpVersion.Version30;

public static IEnumerable<object[]> Http3Test_MemberData()
{
object[][] options = new[]
{
new object[] { null },
new object[] { 1 },
new object[] { 2 },
new object[] { 16 },
new object[] { 64 },
new object[] { 256 },
new object[] { 1024 },
new object[] { 10240 },
};

var rng = new Random();
int count = options.Length * 50;

for (int i = 0; i < count; i++)
{
yield return options[rng.Next(options.Length)];
}
}

[Theory]
[InlineData(null)]
[InlineData(1)]
[InlineData(16)]
[InlineData(64)]
[InlineData(256)]
[InlineData(1024)]
[InlineData(10240)]
[MemberData(nameof(Http3Test_MemberData))]
public async Task Http3Test(int? maxResponseHeadersLength)
{
for (int repeat = 0; repeat < 100; repeat++)
var requestCts = new CancellationTokenSource();
var controlStreamEstablishedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);

await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
{
var requestCts = new CancellationTokenSource();
var controlStreamEstablishedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
using HttpClientHandler handler = CreateHttpClientHandler();
using HttpClient client = CreateHttpClient(handler);

await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
if (maxResponseHeadersLength.HasValue)
{
using HttpClientHandler handler = CreateHttpClientHandler();
using HttpClient client = CreateHttpClient(handler);

if (maxResponseHeadersLength.HasValue)
{
handler.MaxResponseHeadersLength = maxResponseHeadersLength.Value;
}
handler.MaxResponseHeadersLength = maxResponseHeadersLength.Value;
}

await Assert.ThrowsAnyAsync<Exception>(() => client.GetAsync(uri, requestCts.Token));
await Assert.ThrowsAnyAsync<Exception>(() => client.GetAsync(uri, requestCts.Token));

await controlStreamEstablishedTcs.Task.WaitAsync(TestHelper.PassingTestTimeout);
},
async server =>
await controlStreamEstablishedTcs.Task.WaitAsync(TestHelper.PassingTestTimeout);
},
async server =>
{
await server.AcceptConnectionAsync(async connection =>
{
await server.AcceptConnectionAsync(async connection =>
{
requestCts.Cancel();
requestCts.Cancel();

var http3Connection = (Http3LoopbackConnection)connection;
var http3Connection = (Http3LoopbackConnection)connection;

await http3Connection.EnsureControlStreamAcceptedAsync().WaitAsync(TestHelper.PassingTestTimeout);
await http3Connection.EnsureControlStreamAcceptedAsync().WaitAsync(TestHelper.PassingTestTimeout);

controlStreamEstablishedTcs.SetResult();
});
controlStreamEstablishedTcs.SetResult();
});
}
});
}
}

Expand Down