[fix] 空指针错误

This commit is contained in:
springhgui 2021-10-30 10:54:47 +08:00
parent 05260cb5e8
commit 49b1a9b59e
3 changed files with 53 additions and 39 deletions

View File

@ -15,7 +15,7 @@ namespace FastTunnel.Core.Extensions
ct.Token.Register(() =>
{
tcs.TrySetCanceled();
action.Invoke();
action?.Invoke();
}, useSynchronizationContext: false);
}
}

View File

@ -38,13 +38,20 @@ namespace FastTunnel.Core.MiddleWares
public async Task Handle(HttpContext context, Func<Task> next)
{
if (!context.WebSockets.IsWebSocketRequest || !context.Request.Headers.TryGetValue(FastTunnelConst.FASTTUNNEL_VERSION, out var version))
try
{
await next();
return;
};
if (!context.WebSockets.IsWebSocketRequest || !context.Request.Headers.TryGetValue(FastTunnelConst.FASTTUNNEL_VERSION, out var version))
{
await next();
return;
};
await handleClient(context, next, version);
await handleClient(context, next, version);
}
catch (Exception ex)
{
logger.LogError(ex);
}
}
private async Task handleClient(HttpContext context, Func<Task> next, string clientVersion)

View File

@ -25,43 +25,50 @@ namespace FastTunnel.Core.Forwarder.MiddleWare
public async Task Handle(HttpContext context, Func<Task> next)
{
if (context.Request.Method != "PROXY")
try
{
await next();
return;
if (context.Request.Method != "PROXY")
{
await next();
return;
}
var requestId = context.Request.Path.Value.Trim('/');
logger.LogDebug($"[PROXY]:Start {requestId}");
if (!fastTunnelServer.ResponseTasks.TryRemove(requestId, out var responseAwaiter))
{
logger.LogError($"[PROXY]:RequestId不存在 {requestId}");
return;
};
var lifetime = context.Features.Get<IConnectionLifetimeFeature>();
var transport = context.Features.Get<IConnectionTransportFeature>();
if (lifetime == null || transport == null)
{
await next();
return;
}
using var reverseConnection = new WebSocketStream(lifetime, transport);
responseAwaiter.TrySetResult(reverseConnection);
var closedAwaiter = new TaskCompletionSource<object>();
closedAwaiter.SetTimeOut(1000 * 60 * 30, null);
lifetime.ConnectionClosed.Register((task) =>
{
(task as TaskCompletionSource<object>).SetResult(null);
}, closedAwaiter);
await closedAwaiter.Task;
logger.LogError($"[PROXY]:Closed {requestId}");
}
var requestId = context.Request.Path.Value.Trim('/');
logger.LogDebug($"[PROXY]:Start {requestId}");
if (!fastTunnelServer.ResponseTasks.TryRemove(requestId, out var responseAwaiter))
catch (Exception ex)
{
logger.LogError($"[PROXY]:RequestId不存在 {requestId}");
return;
};
var lifetime = context.Features.Get<IConnectionLifetimeFeature>();
var transport = context.Features.Get<IConnectionTransportFeature>();
if (lifetime == null || transport == null)
{
await next();
return;
logger.LogError(ex);
}
using var reverseConnection = new WebSocketStream(lifetime, transport);
responseAwaiter.TrySetResult(reverseConnection);
var closedAwaiter = new TaskCompletionSource<object>();
closedAwaiter.SetTimeOut(1000 * 60 * 30, null);
lifetime.ConnectionClosed.Register((task) =>
{
(task as TaskCompletionSource<object>).SetResult(null);
}, closedAwaiter);
await closedAwaiter.Task;
logger.LogError($"[PROXY]:Closed {requestId}");
}
}
}