public async Task <ConnectResult> Connect(ConnectArgument arg) { try { var result = await ProtectedConnect(arg); if (!result.IsRedirected && !result.Ok && if_failed != null) { Logging.error(ToString() + $": {arg} failed ({result.FailedReason}), redirecting to {if_failed}."); return(ConnectResult.RedirectTo(this, if_failed)); } return(result); } catch (Exception ex) when(if_failed != null) { Logging.exception(ex, Logging.Level.Error, ToString() + $": {arg} failed, redirecting to {if_failed}."); return(ConnectResult.RedirectTo(this, if_failed)); } catch (Exception) { throw; } }
public static Task <ConnectResult> ConnectWrapper(IConnectionHandler handler, ConnectArgument arg) { var tcs = new TaskCompletionSource <ConnectResult>(); var newinc = InConnectionTcp.Create(arg.InAdapter, arg.Dest, async(r) => { if (r.Ok) { var stream = new LoopbackStream(); r.Stream = stream; tcs.SetResult(r); return(stream.Another); } else { tcs.SetResult(r); return(null); } }); newinc.Url = arg.Url; newinc.DestOriginalName = arg.DestOriginalName; NaiveUtils.RunAsyncTask(async() => { try { await handler.HandleTcpConnection(newinc).CAF(); } catch (Exception e) { tcs.SetException(e); return; } if (newinc.IsRedirected && tcs.Task.IsCompleted == false) { tcs.SetResult(ConnectResult.RedirectTo(handler, newinc.Redirected)); } else { tcs.SetException(new Exception("handleConnection() did nothing.")); } }); return(tcs.Task); }