Commit 56de40a3 authored by justcoding121's avatar justcoding121

use try finally to release connection

parent abc21b87
...@@ -44,7 +44,7 @@ namespace Titanium.Web.Proxy ...@@ -44,7 +44,7 @@ namespace Titanium.Web.Proxy
{ {
string connectHostname = null; string connectHostname = null;
TunnelConnectSessionEventArgs connectArgs = null; TunnelConnectSessionEventArgs connectArgs = null;
// Client wants to create a secure tcp tunnel (probably its a HTTPS or Websocket request) // Client wants to create a secure tcp tunnel (probably its a HTTPS or Websocket request)
if (await HttpHelper.IsConnectMethod(clientStream) == 1) if (await HttpHelper.IsConnectMethod(clientStream) == 1)
...@@ -212,38 +212,43 @@ namespace Titanium.Web.Proxy ...@@ -212,38 +212,43 @@ namespace Titanium.Web.Proxy
var connection = await getServerConnection(connectArgs, true, var connection = await getServerConnection(connectArgs, true,
null, cancellationToken); null, cancellationToken);
if (isClientHello) try
{ {
int available = clientStream.Available; if (isClientHello)
if (available > 0)
{ {
// send the buffered data int available = clientStream.Available;
var data = BufferPool.GetBuffer(BufferSize); if (available > 0)
try
{
// clientStream.Available sbould be at most BufferSize because it is using the same buffer size
await clientStream.ReadAsync(data, 0, available, cancellationToken);
await connection.StreamWriter.WriteAsync(data, 0, available, true,
cancellationToken);
}
finally
{ {
BufferPool.ReturnBuffer(data); // send the buffered data
var data = BufferPool.GetBuffer(BufferSize);
try
{
// clientStream.Available sbould be at most BufferSize because it is using the same buffer size
await clientStream.ReadAsync(data, 0, available, cancellationToken);
await connection.StreamWriter.WriteAsync(data, 0, available, true,
cancellationToken);
}
finally
{
BufferPool.ReturnBuffer(data);
}
} }
var serverHelloInfo =
await SslTools.PeekServerHello(connection.Stream, BufferPool, cancellationToken);
((ConnectResponse)connectArgs.WebSession.Response).ServerHelloInfo = serverHelloInfo;
} }
var serverHelloInfo = await TcpHelper.SendRaw(clientStream, connection.Stream, BufferPool, BufferSize,
await SslTools.PeekServerHello(connection.Stream, BufferPool, cancellationToken); (buffer, offset, count) => { connectArgs.OnDataSent(buffer, offset, count); },
((ConnectResponse)connectArgs.WebSession.Response).ServerHelloInfo = serverHelloInfo; (buffer, offset, count) => { connectArgs.OnDataReceived(buffer, offset, count); },
connectArgs.CancellationTokenSource, ExceptionFunc);
}
finally
{
await tcpConnectionFactory.Release(connection, true);
} }
await TcpHelper.SendRaw(clientStream, connection.Stream, BufferPool, BufferSize,
(buffer, offset, count) => { connectArgs.OnDataSent(buffer, offset, count); },
(buffer, offset, count) => { connectArgs.OnDataReceived(buffer, offset, count); },
connectArgs.CancellationTokenSource, ExceptionFunc);
await tcpConnectionFactory.Release(connection, true);
return; return;
} }
} }
...@@ -276,7 +281,8 @@ namespace Titanium.Web.Proxy ...@@ -276,7 +281,8 @@ namespace Titanium.Web.Proxy
// create new connection // create new connection
var connection = await getServerConnection(connectArgs, true, SslExtensions.Http2ProtocolAsList, var connection = await getServerConnection(connectArgs, true, SslExtensions.Http2ProtocolAsList,
cancellationToken); cancellationToken);
try
{
await connection.StreamWriter.WriteLineAsync("PRI * HTTP/2.0", cancellationToken); await connection.StreamWriter.WriteLineAsync("PRI * HTTP/2.0", cancellationToken);
await connection.StreamWriter.WriteLineAsync(cancellationToken); await connection.StreamWriter.WriteLineAsync(cancellationToken);
await connection.StreamWriter.WriteLineAsync("SM", cancellationToken); await connection.StreamWriter.WriteLineAsync("SM", cancellationToken);
...@@ -288,7 +294,11 @@ namespace Titanium.Web.Proxy ...@@ -288,7 +294,11 @@ namespace Titanium.Web.Proxy
(buffer, offset, count) => { connectArgs.OnDataReceived(buffer, offset, count); }, (buffer, offset, count) => { connectArgs.OnDataReceived(buffer, offset, count); },
connectArgs.CancellationTokenSource, clientConnection.Id, ExceptionFunc); connectArgs.CancellationTokenSource, clientConnection.Id, ExceptionFunc);
#endif #endif
await tcpConnectionFactory.Release(connection, true); }
finally
{
await tcpConnectionFactory.Release(connection, true);
}
} }
} }
calledRequestHandler = true; calledRequestHandler = true;
...@@ -318,7 +328,7 @@ namespace Titanium.Web.Proxy ...@@ -318,7 +328,7 @@ namespace Titanium.Web.Proxy
} }
finally finally
{ {
if (!calledRequestHandler if (!calledRequestHandler
&& prefetchConnectionTask != null) && prefetchConnectionTask != null)
{ {
var connection = await prefetchConnectionTask; var connection = await prefetchConnectionTask;
......
...@@ -98,34 +98,38 @@ namespace Titanium.Web.Proxy ...@@ -98,34 +98,38 @@ namespace Titanium.Web.Proxy
null, false, null, null, false, null,
true, this, UpStreamEndPoint, UpStreamHttpsProxy, cancellationToken); true, this, UpStreamEndPoint, UpStreamHttpsProxy, cancellationToken);
try
var serverStream = connection.Stream;
int available = clientStream.Available;
if (available > 0)
{ {
// send the buffered data var serverStream = connection.Stream;
var data = BufferPool.GetBuffer(BufferSize);
try int available = clientStream.Available;
{ if (available > 0)
// clientStream.Available sbould be at most BufferSize because it is using the same buffer size
await clientStream.ReadAsync(data, 0, available, cancellationToken);
await serverStream.WriteAsync(data, 0, available, cancellationToken);
await serverStream.FlushAsync(cancellationToken);
}
finally
{ {
BufferPool.ReturnBuffer(data); // send the buffered data
var data = BufferPool.GetBuffer(BufferSize);
try
{
// clientStream.Available sbould be at most BufferSize because it is using the same buffer size
await clientStream.ReadAsync(data, 0, available, cancellationToken);
await serverStream.WriteAsync(data, 0, available, cancellationToken);
await serverStream.FlushAsync(cancellationToken);
}
finally
{
BufferPool.ReturnBuffer(data);
}
} }
}
await TcpHelper.SendRaw(clientStream, serverStream, BufferPool, BufferSize, await TcpHelper.SendRaw(clientStream, serverStream, BufferPool, BufferSize,
null, null, cancellationTokenSource, ExceptionFunc); null, null, cancellationTokenSource, ExceptionFunc);
}
finally
{
await tcpConnectionFactory.Release(connection, true);
}
await tcpConnectionFactory.Release(connection, true);
return; return;
} }
} }
calledRequestHandler = true; calledRequestHandler = true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment