using FastGithub.DomainResolve; using Microsoft.AspNetCore.Connections; using System.IO.Pipelines; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; namespace FastGithub.ReverseProxy { /// /// github的ssh代理处理者 /// sealed class GithubSshProxyHandler : ConnectionHandler { private readonly IDomainResolver domainResolver; private readonly DnsEndPoint githubSshEndPoint = new("ssh.github.com", 443); /// /// github的ssh代理处理者 /// /// public GithubSshProxyHandler(IDomainResolver domainResolver) { this.domainResolver = domainResolver; } /// /// ssh连接后 /// /// /// public override async Task OnConnectedAsync(ConnectionContext context) { var address = await this.domainResolver.ResolveAsync(this.githubSshEndPoint); using var socket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); await socket.ConnectAsync(address, this.githubSshEndPoint.Port); var targetStream = new NetworkStream(socket, ownsSocket: false); var task1 = targetStream.CopyToAsync(context.Transport.Output); var task2 = context.Transport.Input.CopyToAsync(targetStream); await Task.WhenAny(task1, task2); } } }