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;
}
}
}