using FastGithub.Scanner;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Security;
using System.Net.Sockets;
namespace FastGithub
{
///
/// 服务注册扩展
///
public static class ScannerServiceCollectionExtensions
{
///
/// 注册程序集下所有服务下选项
///
///
/// 配置
///
public static IServiceCollection AddGithubScanner(this IServiceCollection services, IConfiguration configuration)
{
var assembly = typeof(ScannerServiceCollectionExtensions).Assembly;
var defaultUserAgent = new ProductInfoHeaderValue(assembly.GetName().Name ?? nameof(FastGithub), assembly.GetName().Version?.ToString());
services
.AddHttpClient(nameof(FastGithub))
.SetHandlerLifetime(TimeSpan.FromMinutes(5d))
.ConfigureHttpClient(httpClient =>
{
httpClient.Timeout = TimeSpan.FromSeconds(10d);
httpClient.DefaultRequestHeaders.Accept.TryParseAdd("*/*");
httpClient.DefaultRequestHeaders.UserAgent.Add(defaultUserAgent);
})
.ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler
{
Proxy = null,
UseProxy = false,
AllowAutoRedirect = false,
ConnectCallback = async (ctx, ct) =>
{
var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
await socket.ConnectAsync(ctx.DnsEndPoint, ct);
var stream = new NetworkStream(socket, ownsSocket: true);
if (ctx.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;
}
})
.AddHttpMessageHandler();
return services
.AddMemoryCache()
.AddServiceAndOptions(assembly, configuration)
.AddHostedService()
.AddHostedService()
.AddSingleton(appService => appService.GetRequiredService());
;
}
}
}