Skip to content
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 @@ -71,18 +71,16 @@ internal partial class HttpConnection : HttpConnectionBase, IDisposable

public HttpConnection(
HttpConnectionPool pool,
Socket? socket,
Stream stream,
TransportContext? transportContext)
{
Debug.Assert(pool != null);
Debug.Assert(stream != null);

_pool = pool;
_socket = socket;
_stream = stream;
if (stream is NetworkStream networkStream)
{
_socket = networkStream.Socket;
}

_transportContext = transportContext;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,7 @@ public byte[] Http2AltSvcOriginUri
}

// Try to establish an HTTP2 connection
Socket? socket = null;
Stream? stream = null;
SslStream? sslStream = null;
TransportContext? transportContext = null;
Expand All @@ -600,7 +601,7 @@ public byte[] Http2AltSvcOriginUri

HttpResponseMessage? failureResponse;

(stream, transportContext, failureResponse) =
(socket, stream, transportContext, failureResponse) =
await ConnectAsync(request, async, cancellationToken).ConfigureAwait(false);

if (failureResponse != null)
Expand Down Expand Up @@ -690,7 +691,7 @@ public byte[] Http2AltSvcOriginUri

if (canUse)
{
return (await ConstructHttp11Connection(stream!, transportContext, request, cancellationToken).ConfigureAwait(false), true, null);
return (await ConstructHttp11Connection(socket, stream!, transportContext, request, cancellationToken).ConfigureAwait(false), true, null);
}
else
{
Expand Down Expand Up @@ -1222,7 +1223,7 @@ public ValueTask<HttpResponseMessage> SendAsync(HttpRequestMessage request, bool
return SendWithProxyAuthAsync(request, async, doRequestAuth, cancellationToken);
}

private async ValueTask<(Stream?, TransportContext?, HttpResponseMessage?)> ConnectAsync(HttpRequestMessage request, bool async, CancellationToken cancellationToken)
private async ValueTask<(Socket?, Stream?, TransportContext?, HttpResponseMessage?)> ConnectAsync(HttpRequestMessage request, bool async, CancellationToken cancellationToken)
{
// If a non-infinite connect timeout has been set, create and use a new CancellationToken that will be canceled
// when either the original token is canceled or a connect timeout occurs.
Expand Down Expand Up @@ -1258,13 +1259,15 @@ public ValueTask<HttpResponseMessage> SendAsync(HttpRequestMessage request, bool
{
// Return non-success response from proxy.
response.RequestMessage = request;
return (null, null, response);
return (null, null, null, response);
}
break;
}

Debug.Assert(stream != null);

Socket? socket = (stream as NetworkStream)?.Socket;

TransportContext? transportContext = null;
if (IsSecure)
{
Expand All @@ -1273,7 +1276,7 @@ public ValueTask<HttpResponseMessage> SendAsync(HttpRequestMessage request, bool
stream = sslStream;
}

return (stream, transportContext, null);
return (socket, stream, transportContext, null);
}
finally
{
Expand Down Expand Up @@ -1329,15 +1332,15 @@ private ValueTask<Stream> ConnectToTcpHostAsync(string host, int port, HttpReque

internal async ValueTask<(HttpConnection?, HttpResponseMessage?)> CreateHttp11ConnectionAsync(HttpRequestMessage request, bool async, CancellationToken cancellationToken)
{
(Stream? stream, TransportContext? transportContext, HttpResponseMessage? failureResponse) =
(Socket? socket, Stream? stream, TransportContext? transportContext, HttpResponseMessage? failureResponse) =
await ConnectAsync(request, async, cancellationToken).ConfigureAwait(false);

if (failureResponse != null)
{
return (null, failureResponse);
}

return (await ConstructHttp11Connection(stream!, transportContext, request, cancellationToken).ConfigureAwait(false), null);
return (await ConstructHttp11Connection(socket, stream!, transportContext, request, cancellationToken).ConfigureAwait(false), null);
}

private SslClientAuthenticationOptions GetSslOptionsForRequest(HttpRequestMessage request)
Expand Down Expand Up @@ -1384,10 +1387,17 @@ private async ValueTask<Stream> ApplyPlaintextFilter(Stream stream, Version http
return newStream;
}

private async ValueTask<HttpConnection> ConstructHttp11Connection(Stream stream, TransportContext? transportContext, HttpRequestMessage request, CancellationToken cancellationToken)
private async ValueTask<HttpConnection> ConstructHttp11Connection(Socket? socket, Stream stream, TransportContext? transportContext, HttpRequestMessage request, CancellationToken cancellationToken)
{
stream = await ApplyPlaintextFilter(stream, HttpVersion.Version11, request, cancellationToken).ConfigureAwait(false);
return new HttpConnection(this, stream, transportContext);
Stream newStream = await ApplyPlaintextFilter(stream, HttpVersion.Version11, request, cancellationToken).ConfigureAwait(false);

if (newStream != stream)
{
// If a plaintext filter created a new stream, we can't trust that the socket is still applicable.
socket = null;
}

return new HttpConnection(this, socket, newStream, transportContext);
}

private async ValueTask<Http2Connection> ConstructHttp2Connection(Stream stream, HttpRequestMessage request, CancellationToken cancellationToken)
Expand Down