using FastGithub.Scanner; using System.IO; using System.Net.Http; using System.Net.Security; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; namespace FastGithub.ReverseProxy { /// /// 去掉Sni的HttpClient /// sealed class NoneSniHttpClient : HttpMessageInvoker { /// /// 去掉Sni的HttpClient /// /// public NoneSniHttpClient(IGithubScanResults githubScanResults) : base(CreateNoneSniHttpHandler(githubScanResults), disposeHandler: false) { } /// /// 去掉Sni的HttpHandler /// private static HttpMessageHandler CreateNoneSniHttpHandler(IGithubScanResults githubScanResults) { var httpHandler = new SocketsHttpHandler { AllowAutoRedirect = false, UseCookies = false, UseProxy = false, ConnectCallback = ConnectCallback }; return new GithubDnsHttpHandler(githubScanResults, httpHandler); } /// /// 连接回调 /// /// /// /// private static async ValueTask ConnectCallback(SocketsHttpConnectionContext context, CancellationToken cancellationToken) { var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); await socket.ConnectAsync(context.DnsEndPoint, cancellationToken); var stream = new NetworkStream(socket, ownsSocket: true); if (context.InitialRequestMessage.Headers.Host == null) { return stream; } var sslStream = new SslStream(stream, leaveInnerStreamOpen: false, delegate { return true; }); await sslStream.AuthenticateAsClientAsync(string.Empty, null, false); return sslStream; } } }