diff --git a/FastGithub.Core/FastGithub.Core.csproj b/FastGithub.Core/FastGithub.Core.csproj
index 9b80a69..bbb414c 100644
--- a/FastGithub.Core/FastGithub.Core.csproj
+++ b/FastGithub.Core/FastGithub.Core.csproj
@@ -3,6 +3,7 @@
net5.0
enable
+ FastGithub
diff --git a/FastGithub.Scanner/IGithubScanMiddleware.cs b/FastGithub.Core/IMiddleware.cs
similarity index 63%
rename from FastGithub.Scanner/IGithubScanMiddleware.cs
rename to FastGithub.Core/IMiddleware.cs
index d1cdf62..5eeb445 100644
--- a/FastGithub.Scanner/IGithubScanMiddleware.cs
+++ b/FastGithub.Core/IMiddleware.cs
@@ -1,12 +1,13 @@
using System;
using System.Threading.Tasks;
-namespace FastGithub.Scanner
+namespace FastGithub
{
///
/// 定义中间件的接口
- ///
- interface IGithubScanMiddleware
+ ///
+ ///
+ public interface IMiddleware
{
///
/// 执行中间件
@@ -14,6 +15,6 @@ namespace FastGithub.Scanner
/// 上下文
/// 下一个中间件
///
- Task InvokeAsync(GithubContext context, Func next);
+ Task InvokeAsync(TContext context, Func next);
}
}
diff --git a/FastGithub.Core/IPipelineBuilder.cs b/FastGithub.Core/IPipelineBuilder.cs
new file mode 100644
index 0000000..2c68118
--- /dev/null
+++ b/FastGithub.Core/IPipelineBuilder.cs
@@ -0,0 +1,54 @@
+using System;
+using System.Threading.Tasks;
+
+namespace FastGithub
+{
+ ///
+ /// 定义中间件管道创建者的接口
+ ///
+ /// 中间件上下文
+ public interface IPipelineBuilder
+ {
+ ///
+ /// 获取服务提供者
+ ///
+ IServiceProvider AppServices { get; }
+
+ ///
+ /// 使用中间件
+ ///
+ ///
+ ///
+ ///
+ ///
+ IPipelineBuilder Use() where TMiddleware : class, IMiddleware;
+
+ ///
+ /// 使用中间件
+ ///
+ ///
+ ///
+ ///
+ ///
+ IPipelineBuilder Use(Func, Task> middleware);
+
+ ///
+ /// 使用中间件
+ ///
+ /// 中间件
+ ///
+ IPipelineBuilder Use(Func, InvokeDelegate> middleware);
+
+ ///
+ /// 创建所有中间件执行处理者
+ ///
+ ///
+ InvokeDelegate Build();
+
+ ///
+ /// 使用默认配制创建新的PipelineBuilder
+ ///
+ ///
+ IPipelineBuilder New();
+ }
+}
diff --git a/FastGithub.Scanner/GithubScanDelegate.cs b/FastGithub.Core/InvokeDelegate.cs
similarity index 50%
rename from FastGithub.Scanner/GithubScanDelegate.cs
rename to FastGithub.Core/InvokeDelegate.cs
index 7ae6c83..985d433 100644
--- a/FastGithub.Scanner/GithubScanDelegate.cs
+++ b/FastGithub.Core/InvokeDelegate.cs
@@ -1,11 +1,12 @@
using System.Threading.Tasks;
-namespace FastGithub.Scanner
+namespace FastGithub
{
///
/// 表示所有中间件执行委托
- ///
+ ///
+ /// 中间件上下文类型
/// 中间件上下文
///
- delegate Task GithubScanDelegate(GithubContext context);
+ public delegate Task InvokeDelegate(TContext context);
}
diff --git a/FastGithub.Core/PipelineBuilder.cs b/FastGithub.Core/PipelineBuilder.cs
new file mode 100644
index 0000000..ae5cf02
--- /dev/null
+++ b/FastGithub.Core/PipelineBuilder.cs
@@ -0,0 +1,103 @@
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace FastGithub
+{
+ ///
+ /// 表示中间件创建者
+ ///
+ public class PipelineBuilder : IPipelineBuilder
+ {
+ private readonly InvokeDelegate completedHandler;
+ private readonly List, InvokeDelegate>> middlewares = new List, InvokeDelegate>>();
+
+ ///
+ /// 获取服务提供者
+ ///
+ public IServiceProvider AppServices { get; }
+
+ ///
+ /// 中间件创建者
+ ///
+ ///
+ public PipelineBuilder(IServiceProvider appServices)
+ : this(appServices, context => Task.CompletedTask)
+ {
+ }
+
+ ///
+ /// 中间件创建者
+ ///
+ ///
+ /// 完成执行内容处理者
+ public PipelineBuilder(IServiceProvider appServices, InvokeDelegate completedHandler)
+ {
+ this.AppServices = appServices;
+ this.completedHandler = completedHandler;
+ }
+
+
+ ///
+ /// 使用中间件
+ ///
+ ///
+ ///
+ ///
+ ///
+ public IPipelineBuilder Use() where TMiddleware : class, IMiddleware
+ {
+ var middleware = this.AppServices.GetRequiredService();
+ return this.Use(middleware.InvokeAsync);
+ }
+
+ ///
+ /// 使用中间件
+ ///
+ ///
+ ///
+ ///
+ ///
+ public IPipelineBuilder Use(Func, Task> middleware)
+ {
+ return this.Use(next => context => middleware(context, () => next(context)));
+ }
+
+ ///
+ /// 使用中间件
+ ///
+ ///
+ ///
+ public IPipelineBuilder Use(Func, InvokeDelegate> middleware)
+ {
+ this.middlewares.Add(middleware);
+ return this;
+ }
+
+
+ ///
+ /// 创建所有中间件执行处理者
+ ///
+ ///
+ public InvokeDelegate Build()
+ {
+ var handler = this.completedHandler;
+ for (var i = this.middlewares.Count - 1; i >= 0; i--)
+ {
+ handler = this.middlewares[i](handler);
+ }
+ return handler;
+ }
+
+
+ ///
+ /// 使用默认配制创建新的PipelineBuilder
+ ///
+ ///
+ public IPipelineBuilder New()
+ {
+ return new PipelineBuilder(this.AppServices, this.completedHandler);
+ }
+ }
+}
\ No newline at end of file
diff --git a/FastGithub.Core/PipelineBuilderExtensions.cs b/FastGithub.Core/PipelineBuilderExtensions.cs
new file mode 100644
index 0000000..67a585b
--- /dev/null
+++ b/FastGithub.Core/PipelineBuilderExtensions.cs
@@ -0,0 +1,71 @@
+using System;
+
+namespace FastGithub
+{
+ ///
+ /// 中间件创建者扩展
+ ///
+ public static class PipelineBuilderExtensions
+ {
+ ///
+ /// 中断执行中间件
+ ///
+ ///
+ ///
+ /// 处理者
+ ///
+ public static IPipelineBuilder Run(this IPipelineBuilder builder, InvokeDelegate handler)
+ {
+ return builder.Use(_ => handler);
+ }
+
+ ///
+ /// 条件中间件
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static IPipelineBuilder When(this IPipelineBuilder builder, Func predicate, InvokeDelegate handler)
+ {
+ return builder.Use(next => async context =>
+ {
+ if (predicate.Invoke(context) == true)
+ {
+ await handler.Invoke(context);
+ }
+ else
+ {
+ await next(context);
+ }
+ });
+ }
+
+
+ ///
+ /// 条件中间件
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static IPipelineBuilder When(this IPipelineBuilder builder, Func predicate, Action> configureAction)
+ {
+ return builder.Use(next => async context =>
+ {
+ if (predicate.Invoke(context) == true)
+ {
+ var branchBuilder = builder.New();
+ configureAction(branchBuilder);
+ await branchBuilder.Build().Invoke(context);
+ }
+ else
+ {
+ await next(context);
+ }
+ });
+ }
+ }
+}
diff --git a/FastGithub.Scanner/GithubScanBuilder.cs b/FastGithub.Scanner/GithubScanBuilder.cs
deleted file mode 100644
index 077e0a3..0000000
--- a/FastGithub.Scanner/GithubScanBuilder.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-
-namespace FastGithub.Scanner
-{
- ///
- /// 表示中间件创建者
- ///
- sealed class GithubScanBuilder : IGithubScanBuilder
- {
- private readonly GithubScanDelegate completedHandler;
- private readonly List> middlewares = new();
-
- ///
- /// 获取服务提供者
- ///
- public IServiceProvider AppServices { get; }
-
- ///
- /// 中间件创建者
- ///
- ///
- public GithubScanBuilder(IServiceProvider appServices)
- : this(appServices, context => Task.CompletedTask)
- {
- }
-
- ///
- /// 中间件创建者
- ///
- ///
- /// 完成执行内容处理者
- public GithubScanBuilder(IServiceProvider appServices, GithubScanDelegate completedHandler)
- {
- this.AppServices = appServices;
- this.completedHandler = completedHandler;
- }
-
- ///
- /// 使用中间件
- ///
- ///
- ///
- public IGithubScanBuilder Use(Func middleware)
- {
- this.middlewares.Add(middleware);
- return this;
- }
-
-
- ///
- /// 创建所有中间件执行处理者
- ///
- ///
- public GithubScanDelegate Build()
- {
- var handler = this.completedHandler;
- for (var i = this.middlewares.Count - 1; i >= 0; i--)
- {
- handler = this.middlewares[i](handler);
- }
- return handler;
- }
- }
-}
\ No newline at end of file
diff --git a/FastGithub.Scanner/GithubScanBuilderExtensions.cs b/FastGithub.Scanner/GithubScanBuilderExtensions.cs
deleted file mode 100644
index e70cca5..0000000
--- a/FastGithub.Scanner/GithubScanBuilderExtensions.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Threading.Tasks;
-
-namespace FastGithub.Scanner
-{
- ///
- /// 中间件创建者扩展
- ///
- static class GithubScanBuilderExtensions
- {
- ///
- /// 使用中间件
- ///
- ///
- ///
- ///
- public static IGithubScanBuilder Use(this IGithubScanBuilder builder) where TMiddleware : class, IGithubScanMiddleware
- {
- return builder.AppServices.GetService(typeof(TMiddleware)) is TMiddleware middleware
- ? builder.Use(middleware.InvokeAsync)
- : throw new InvalidOperationException($"无法获取服务{typeof(TMiddleware)}");
- }
-
- ///
- /// 使用中间件
- ///
- ///
- ///
- ///
- ///
- public static IGithubScanBuilder Use(this IGithubScanBuilder builder, Func, Task> middleware)
- {
- return builder.Use(next => context => middleware(context, () => next(context)));
- }
- }
-}
diff --git a/FastGithub.Scanner/GithubScanService.cs b/FastGithub.Scanner/GithubScanService.cs
index 795b81c..e44c74b 100644
--- a/FastGithub.Scanner/GithubScanService.cs
+++ b/FastGithub.Scanner/GithubScanService.cs
@@ -1,4 +1,5 @@
-using Microsoft.Extensions.DependencyInjection;
+using FastGithub.Scanner.Middlewares;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
@@ -12,18 +13,34 @@ namespace FastGithub.Scanner
sealed class GithubScanService : IGithubScanService
{
private readonly GithubMetaService metaService;
- private readonly GithubScanDelegate scanDelegate;
private readonly ILogger logger;
private readonly GithubContextHashSet results = new();
+ private readonly InvokeDelegate fullScanDelegate;
+ private readonly InvokeDelegate resultScanDelegate;
+
public GithubScanService(
GithubMetaService metaService,
- GithubScanDelegate scanDelegate,
- ILogger logger)
+ ILogger logger,
+ IPipelineBuilder pipelineBuilder)
{
this.metaService = metaService;
- this.scanDelegate = scanDelegate;
this.logger = logger;
+
+ this.fullScanDelegate = pipelineBuilder
+ .New()
+ .Use()
+ .Use()
+ .Use()
+ .Use()
+ .Build();
+
+ this.resultScanDelegate = pipelineBuilder
+ .New()
+ .Use()
+ .Use()
+ .Use()
+ .Build();
}
public async Task ScanAllAsync(CancellationToken cancellationToken = default)
@@ -40,7 +57,7 @@ namespace FastGithub.Scanner
async Task ScanAsync(GithubContext context)
{
- await this.scanDelegate(context);
+ await this.fullScanDelegate(context);
if (context.HttpElapsed != null)
{
lock (this.results.SyncRoot)
@@ -63,7 +80,7 @@ namespace FastGithub.Scanner
foreach (var context in contexts)
{
context.HttpElapsed = null;
- await this.scanDelegate(context);
+ await this.resultScanDelegate(context);
}
this.logger.LogInformation("结果扫描结束");
diff --git a/FastGithub.Scanner/IGithubScanBuilder.cs b/FastGithub.Scanner/IGithubScanBuilder.cs
deleted file mode 100644
index 3ad3453..0000000
--- a/FastGithub.Scanner/IGithubScanBuilder.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace FastGithub.Scanner
-{
- ///
- /// 定义中间件管道创建者的接口
- ///
- interface IGithubScanBuilder
- {
- ///
- /// 获取服务提供者
- ///
- IServiceProvider AppServices { get; }
-
- ///
- /// 使用中间件
- ///
- /// 中间件
- ///
- IGithubScanBuilder Use(Func middleware);
-
- ///
- /// 创建所有中间件执行处理者
- ///
- ///
- GithubScanDelegate Build();
- }
-}
diff --git a/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs b/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs
index 918b2dc..0a18c72 100644
--- a/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/ConcurrentMiddleware.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.Middlewares
{
[Service(ServiceLifetime.Singleton)]
- sealed class ConcurrentMiddleware : IGithubScanMiddleware
+ sealed class ConcurrentMiddleware : IMiddleware
{
private readonly SemaphoreSlim semaphoreSlim = new(Environment.ProcessorCount * 4);
diff --git a/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs b/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs
index e974495..09119b6 100644
--- a/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/HttpsScanMiddleware.cs
@@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.Middlewares
{
[Service(ServiceLifetime.Singleton)]
- sealed class HttpsScanMiddleware : IGithubScanMiddleware
+ sealed class HttpsScanMiddleware : IMiddleware
{
private readonly IOptionsMonitor options;
private readonly ILogger logger;
diff --git a/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs b/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs
index f3058c9..5f6f555 100644
--- a/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/PortScanMiddleware.cs
@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.Middlewares
{
[Service(ServiceLifetime.Singleton)]
- sealed class PortScanMiddleware : IGithubScanMiddleware
+ sealed class PortScanMiddleware : IMiddleware
{
private const int PORT = 443;
private readonly IOptionsMonitor options;
diff --git a/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs b/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs
index 52aafc5..3730642 100644
--- a/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs
+++ b/FastGithub.Scanner/Middlewares/ScanOkLogMiddleware.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace FastGithub.Scanner.Middlewares
{
[Service(ServiceLifetime.Singleton)]
- sealed class ScanOkLogMiddleware : IGithubScanMiddleware
+ sealed class ScanOkLogMiddleware : IMiddleware
{
private readonly ILogger logger;
diff --git a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs
index 8fd9137..a3d9572 100644
--- a/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs
+++ b/FastGithub.Scanner/ScannerServiceCollectionExtensions.cs
@@ -1,5 +1,4 @@
using FastGithub.Scanner;
-using FastGithub.Scanner.Middlewares;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Threading.Tasks;
@@ -22,18 +21,13 @@ namespace FastGithub
var assembly = typeof(ScannerServiceCollectionExtensions).Assembly;
return services
.AddHttpClient()
- .AddSingleton(serviceProvider =>
- {
- return new GithubScanBuilder(serviceProvider, ctx => Task.CompletedTask)
- .Use()
- .Use()
- .Use()
- .Use()
- .Build();
- })
.AddServiceAndOptions(assembly, configuration)
.AddHostedService()
.AddHostedService()
+ .AddSingleton>(appService =>
+ {
+ return new PipelineBuilder(appService, ctx => Task.CompletedTask);
+ })
;
}
}