GithubSshProxyHandler.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. using FastGithub.DomainResolve;
  2. using Microsoft.AspNetCore.Connections;
  3. using System.IO.Pipelines;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Threading.Tasks;
  7. namespace FastGithub.ReverseProxy
  8. {
  9. /// <summary>
  10. /// github的ssh代理处理者
  11. /// </summary>
  12. sealed class GithubSshProxyHandler : ConnectionHandler
  13. {
  14. private readonly IDomainResolver domainResolver;
  15. private readonly DnsEndPoint githubSshEndPoint = new("ssh.github.com", 443);
  16. /// <summary>
  17. /// github的ssh代理处理者
  18. /// </summary>
  19. /// <param name="domainResolver"></param>
  20. public GithubSshProxyHandler(IDomainResolver domainResolver)
  21. {
  22. this.domainResolver = domainResolver;
  23. }
  24. /// <summary>
  25. /// ssh连接后
  26. /// </summary>
  27. /// <param name="context"></param>
  28. /// <returns></returns>
  29. public override async Task OnConnectedAsync(ConnectionContext context)
  30. {
  31. var address = await this.domainResolver.ResolveAsync(this.githubSshEndPoint);
  32. using var socket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
  33. await socket.ConnectAsync(address, this.githubSshEndPoint.Port);
  34. var targetStream = new NetworkStream(socket, ownsSocket: false);
  35. var task1 = targetStream.CopyToAsync(context.Transport.Output);
  36. var task2 = context.Transport.Input.CopyToAsync(targetStream);
  37. await Task.WhenAny(task1, task2);
  38. }
  39. }
  40. }