Skip to content

Commit 279e5e6

Browse files
committed
重构请求变换
1 parent bb6b10f commit 279e5e6

File tree

7 files changed

+37
-28
lines changed

7 files changed

+37
-28
lines changed

HttpMouse/Abstractions/IReverseConnectionService.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using Microsoft.AspNetCore.Connections;
22
using System;
33
using System.IO;
4-
using System.Net.Http;
54
using System.Threading;
65
using System.Threading.Tasks;
76

@@ -15,10 +14,10 @@ public interface IReverseConnectionService
1514
/// <summary>
1615
/// 创建一个反向连接
1716
/// </summary>
18-
/// <param name="context"></param>
17+
/// <param name="clientDomain">客户端域名</param>
1918
/// <param name="cancellation"></param>
2019
/// <returns></returns>
21-
ValueTask<Stream> CreateReverseConnectionAsync(SocketsHttpConnectionContext context, CancellationToken cancellation);
20+
ValueTask<Stream> CreateReverseConnectionAsync(string clientDomain, CancellationToken cancellation);
2221

2322
/// <summary>
2423
/// 处理kestrel的连接

HttpMouse/Implementions/MainConnection.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ sealed class MainConnection : IMainConnection
1818
{
1919
private readonly WebSocket webSocket;
2020
private readonly IOptionsMonitor<HttpMouseOptions> options;
21-
private static readonly ForwarderRequestConfig defaultHttpRequest = new();
2221

2322
/// <summary>
2423
/// 获取绑定的域名
@@ -62,7 +61,7 @@ public ClusterConfig ToClusterConfig()
6261

6362
if (this.options.CurrentValue.HttpRequest.TryGetValue(this.Domain, out var httpRequest) == false)
6463
{
65-
httpRequest = defaultHttpRequest;
64+
httpRequest = ForwarderRequestConfig.Empty;
6665
}
6766

6867
return new ClusterConfig

HttpMouse/Implementions/MemoryConfig.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace HttpMouse.Implementions
1111
/// </summary>
1212
sealed class MemoryConfig : IProxyConfig
1313
{
14-
private readonly CancellationTokenSource cancellationToken = new CancellationTokenSource();
14+
private readonly CancellationTokenSource cancellationToken = new();
1515

1616
/// <summary>
1717
/// 获取路由配置

HttpMouse/Implementions/ReverseConnectionService.cs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Concurrent;
66
using System.IO;
77
using System.IO.Pipelines;
8-
using System.Net.Http;
98
using System.Threading;
109
using System.Threading.Tasks;
1110

@@ -17,7 +16,6 @@ namespace HttpMouse.Implementions
1716
sealed class ReverseConnectionService : IReverseConnectionService
1817
{
1918
private uint _reverseConnectionId = 0;
20-
private readonly HttpRequestOptionsKey<string> clientDomainKey = new("ClientDomain");
2119
private readonly TimeSpan timeout = TimeSpan.FromSeconds(10d);
2220
private readonly ConcurrentDictionary<uint, IAwaitableCompletionSource<Stream>> reverseConnectAwaiterTable = new();
2321

@@ -40,16 +38,11 @@ public ReverseConnectionService(
4038
/// <summary>
4139
/// 创建一个反向连接
4240
/// </summary>
43-
/// <param name="context"></param>
41+
/// <param name="clientDomain">客户端域名</param>
4442
/// <param name="cancellation"></param>
4543
/// <returns></returns>
46-
public async ValueTask<Stream> CreateReverseConnectionAsync(SocketsHttpConnectionContext context, CancellationToken cancellation)
44+
public async ValueTask<Stream> CreateReverseConnectionAsync(string clientDomain, CancellationToken cancellation)
4745
{
48-
if (context.InitialRequestMessage.Options.TryGetValue(clientDomainKey, out var clientDomain) == false)
49-
{
50-
throw new InvalidOperationException("无法创建反向连接:未知道目标域名");
51-
}
52-
5346
if (this.mainConnectionService.TryGetValue(clientDomain, out var mainConnection) == false)
5447
{
5548
throw new Exception($"无法创建反向连接:上游{clientDomain}未连接");

HttpMouse/Implementions/ReverseHttpClientFactory.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ namespace HttpMouse.Implementions
1515
/// </summary>
1616
sealed class ReverseHttpClientFactory : IForwarderHttpClientFactory, IDisposable
1717
{
18+
private readonly HttpRequestOptionsKey<string> clientDomainKey = new("ClientDomain");
19+
1820
private readonly SocketsHttpHandler httpHandler;
1921
private readonly IReverseConnectionService reverseConnectionService;
2022
private readonly ILogger<ReverseHttpClientFactory> logger;
@@ -25,7 +27,8 @@ sealed class ReverseHttpClientFactory : IForwarderHttpClientFactory, IDisposable
2527
/// <param name="reverseConnectionService"></param>
2628
/// <param name="logger"></param>
2729
public ReverseHttpClientFactory(
28-
IReverseConnectionService reverseConnectionService, ILogger<ReverseHttpClientFactory> logger)
30+
IReverseConnectionService reverseConnectionService,
31+
ILogger<ReverseHttpClientFactory> logger)
2932
{
3033
this.reverseConnectionService = reverseConnectionService;
3134
this.logger = logger;
@@ -52,9 +55,14 @@ public ReverseHttpClientFactory(
5255
/// <returns></returns>
5356
private async ValueTask<Stream> ConnectCallback(SocketsHttpConnectionContext context, CancellationToken cancellation)
5457
{
58+
if (context.InitialRequestMessage.Options.TryGetValue(clientDomainKey, out var clientDomain) == false)
59+
{
60+
throw new InvalidOperationException($"未设置{nameof(HttpRequestMessage)}的Options:{clientDomainKey.Key}");
61+
}
62+
5563
try
5664
{
57-
return await this.reverseConnectionService.CreateReverseConnectionAsync(context, cancellation);
65+
return await this.reverseConnectionService.CreateReverseConnectionAsync(clientDomain, cancellation);
5866
}
5967
catch (Exception ex)
6068
{

HttpMouse/FallbackExtensions.cs renamed to HttpMouse/ReverseProxyExtensions.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,30 @@
33
using Microsoft.AspNetCore.Routing;
44
using Microsoft.Extensions.DependencyInjection;
55
using Microsoft.Extensions.Options;
6+
using System.Net.Http;
7+
using System.Threading.Tasks;
8+
using Yarp.ReverseProxy.Transforms;
69

710
namespace HttpMouse
811
{
9-
static class FallbackExtensions
12+
static class ReverseProxyExtensions
1013
{
14+
/// <summary>
15+
/// 添加ClientDomain的options
16+
/// </summary>
17+
/// <param name="builder"></param>
18+
/// <returns></returns>
19+
public static IReverseProxyBuilder AddClientDomainOptionsTransform(this IReverseProxyBuilder builder)
20+
{
21+
var optionsKey = new HttpRequestOptionsKey<string>("ClientDomain");
22+
return builder.AddTransforms(ctx => ctx.AddRequestTransform(request =>
23+
{
24+
var clientDomain = request.HttpContext.Request.Host.Host;
25+
request.ProxyRequest.Options.Set(optionsKey, clientDomain);
26+
return ValueTask.CompletedTask;
27+
}));
28+
}
29+
1130
/// <summary>
1231
/// 映射反向代理回退
1332
/// </summary>

HttpMouse/Startup.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@
44
using Microsoft.Extensions.DependencyInjection;
55
using Microsoft.Extensions.Hosting;
66
using Serilog;
7-
using System.Net.Http;
8-
using System.Threading.Tasks;
97
using Yarp.ReverseProxy.Configuration;
108
using Yarp.ReverseProxy.Forwarder;
11-
using Yarp.ReverseProxy.Transforms;
129

1310
namespace HttpMouse
1411
{
@@ -29,13 +26,7 @@ public void ConfigureServices(IServiceCollection services)
2926
{
3027
services
3128
.AddReverseProxy()
32-
.AddTransforms(ctx => ctx.AddRequestTransform(request =>
33-
{
34-
var key = new HttpRequestOptionsKey<string>("ClientDomain");
35-
var clientDomain = request.HttpContext.Request.Host.Host;
36-
request.ProxyRequest.Options.Set(key, clientDomain);
37-
return ValueTask.CompletedTask;
38-
}));
29+
.AddClientDomainOptionsTransform();
3930

4031
services
4132
.AddSingleton<IProxyConfigProvider, MomoryConfigProvider>()

0 commit comments

Comments
 (0)