NoneSniHttpClient.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using FastGithub.Scanner;
  2. using System.IO;
  3. using System.Net.Http;
  4. using System.Net.Security;
  5. using System.Net.Sockets;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace FastGithub.ReverseProxy
  9. {
  10. /// <summary>
  11. /// 去掉Sni的HttpClient
  12. /// </summary>
  13. sealed class NoneSniHttpClient : HttpMessageInvoker
  14. {
  15. /// <summary>
  16. /// 去掉Sni的HttpClient
  17. /// </summary>
  18. /// <param name="githubScanResults"></param>
  19. public NoneSniHttpClient(IGithubScanResults githubScanResults)
  20. : base(CreateNoneSniHttpHandler(githubScanResults), disposeHandler: false)
  21. {
  22. }
  23. /// <summary>
  24. /// 去掉Sni的HttpHandler
  25. /// </summary>
  26. private static HttpMessageHandler CreateNoneSniHttpHandler(IGithubScanResults githubScanResults)
  27. {
  28. var httpHandler = new SocketsHttpHandler
  29. {
  30. AllowAutoRedirect = false,
  31. UseCookies = false,
  32. UseProxy = false,
  33. ConnectCallback = ConnectCallback
  34. };
  35. return new GithubDnsHttpHandler(githubScanResults, httpHandler);
  36. }
  37. /// <summary>
  38. /// 连接回调
  39. /// </summary>
  40. /// <param name="context"></param>
  41. /// <param name="cancellationToken"></param>
  42. /// <returns></returns>
  43. private static async ValueTask<Stream> ConnectCallback(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
  44. {
  45. var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
  46. await socket.ConnectAsync(context.DnsEndPoint, cancellationToken);
  47. var stream = new NetworkStream(socket, ownsSocket: true);
  48. if (context.InitialRequestMessage.Headers.Host == null)
  49. {
  50. return stream;
  51. }
  52. var sslStream = new SslStream(stream, leaveInnerStreamOpen: false, delegate { return true; });
  53. await sslStream.AuthenticateAsClientAsync(string.Empty, null, false);
  54. return sslStream;
  55. }
  56. }
  57. }