Skip to content
Closed
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
@@ -29,12 +29,27 @@ namespace System.Net.Http.Functional.Tests
// to separately Dispose (or have a 'using' statement) for the handler.
public abstract class HttpClientHandlerTest : HttpClientHandlerTestBase
{
public static bool IsNotWinHttpHandler = !IsWinHttpHandler;
private readonly Timer _timer = null;
public HttpClientHandlerTest(ITestOutputHelper output)
: base(output)
{
using (ExecutionContext.SuppressFlow())
{
_timer = new Timer((_) =>
{
Environment.FailFast("Test took too long to complete, likely due to a deadlock or infinite loop.");
}, null, TimeSpan.FromMinutes(5), Timeout.InfiniteTimeSpan);
}
}

public HttpClientHandlerTest(ITestOutputHelper output) : base(output)
protected override void Dispose(bool disposing)
{
_timer?.Dispose();
base.Dispose(disposing);
}

public static bool IsNotWinHttpHandler = !IsWinHttpHandler;

[Fact]
public void CookieContainer_SetNull_ThrowsArgumentNullException()
{
Original file line number Diff line number Diff line change
@@ -1497,41 +1497,56 @@ private async ValueTask<HttpResponseMessage> SendAsync(HttpRequestMessage reques
[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotBrowser))]
public async Task SendAsync_ReuseRequestInHandler_ResetsHeadersForEachReuse()
{
Activity parent0 = new Activity("parent0");
Activity parent1 = new Activity("parent1") { TraceStateString = "wow=1" };
Activity parent2 = new Activity("parent2") { TraceStateString = "wow=2" };
Timer timer = null;
try
{
using (ExecutionContext.SuppressFlow())
{
timer = new Timer((_) =>
{
Environment.FailFast("Test took too long to complete, likely due to a deadlock or infinite loop.");
}, null, TimeSpan.FromMinutes(5), Timeout.InfiniteTimeSpan);
}
Activity parent0 = new Activity("parent0");
Activity parent1 = new Activity("parent1") { TraceStateString = "wow=1" };
Activity parent2 = new Activity("parent2") { TraceStateString = "wow=2" };

const string FirstTraceParent = "00-F";
const string FirstTraceState = "first";
const string FirstTraceParent = "00-F";
const string FirstTraceState = "first";

await GetFactoryForVersion(UseVersion).CreateServerAsync(async (server, uri) =>
{
SendMultipleTimesHandler handler = new SendMultipleTimesHandler(CreateSocketsHttpHandler(allowAllCertificates: true), parent0, parent1, parent2);
using HttpClient client = new HttpClient(handler);
HttpRequestMessage request = CreateRequest(HttpMethod.Get, uri, UseVersion, exactVersion: true);
await GetFactoryForVersion(UseVersion).CreateServerAsync(async (server, uri) =>
{
SendMultipleTimesHandler handler = new SendMultipleTimesHandler(CreateSocketsHttpHandler(allowAllCertificates: true), parent0, parent1, parent2);
using HttpClient client = new HttpClient(handler);
HttpRequestMessage request = CreateRequest(HttpMethod.Get, uri, UseVersion, exactVersion: true);

request.Headers.Add("traceparent", FirstTraceParent);
request.Headers.Add("tracestate", FirstTraceState);
request.Headers.Add("traceparent", FirstTraceParent);
request.Headers.Add("tracestate", FirstTraceState);

Task clientTask = TestAsync ? client.SendAsync(request) : Task.Run(() => client.Send(request));
Task clientTask = TestAsync ? client.SendAsync(request) : Task.Run(() => client.Send(request));

HttpRequestData requestData = await server.AcceptConnectionSendResponseAndCloseAsync(statusCode: HttpStatusCode.InternalServerError);
HttpRequestData requestData = await server.AcceptConnectionSendResponseAndCloseAsync(statusCode: HttpStatusCode.InternalServerError);

// On the first send DiagnosticsHandler should keep user-supplied headers.
string traceparent = GetHeaderValue(requestData, "traceparent");
string tracestate = GetHeaderValue(requestData, "tracestate");
Assert.Equal(FirstTraceParent, traceparent);
Assert.Equal(FirstTraceState, tracestate);
// On the first send DiagnosticsHandler should keep user-supplied headers.
string traceparent = GetHeaderValue(requestData, "traceparent");
string tracestate = GetHeaderValue(requestData, "tracestate");
Assert.Equal(FirstTraceParent, traceparent);
Assert.Equal(FirstTraceState, tracestate);

requestData = await server.AcceptConnectionSendResponseAndCloseAsync(statusCode: HttpStatusCode.InternalServerError);
requestData = await server.AcceptConnectionSendResponseAndCloseAsync(statusCode: HttpStatusCode.InternalServerError);

// Headers should be overridden on each subsequent send.
AssertHeadersAreInjected(requestData, parent1);
requestData = await server.AcceptConnectionSendResponseAndCloseAsync(statusCode: HttpStatusCode.OK);
AssertHeadersAreInjected(requestData, parent2);
// Headers should be overridden on each subsequent send.
AssertHeadersAreInjected(requestData, parent1);
requestData = await server.AcceptConnectionSendResponseAndCloseAsync(statusCode: HttpStatusCode.OK);
AssertHeadersAreInjected(requestData, parent2);

await clientTask;
});
await clientTask;
});
}
finally
{
timer?.Dispose();
}
}

[ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotBrowser))]
Loading
Oops, something went wrong.
Loading
Oops, something went wrong.