Skip to content

Commit bb6b10f

Browse files
committed
重构ReverseHttpClientFactory
1 parent 74f82d3 commit bb6b10f

File tree

2 files changed

+57
-11
lines changed

2 files changed

+57
-11
lines changed

HttpMouse/Implementions/ReverseConnectionService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace HttpMouse.Implementions
1414
/// <summary>
1515
/// 表示反向连接服务
1616
/// </summary>
17-
sealed class ReverseConnectionService: IReverseConnectionService
17+
sealed class ReverseConnectionService : IReverseConnectionService
1818
{
1919
private uint _reverseConnectionId = 0;
2020
private readonly HttpRequestOptionsKey<string> clientDomainKey = new("ClientDomain");
@@ -52,7 +52,7 @@ public async ValueTask<Stream> CreateReverseConnectionAsync(SocketsHttpConnectio
5252

5353
if (this.mainConnectionService.TryGetValue(clientDomain, out var mainConnection) == false)
5454
{
55-
throw new Exception("无法创建反向连接:目标未连接");
55+
throw new Exception($"无法创建反向连接:上游{clientDomain}未连接");
5656
}
5757

5858
var reverseConnectionId = Interlocked.Increment(ref this._reverseConnectionId);
Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,84 @@
11
using Microsoft.Extensions.Logging;
2+
using System;
3+
using System.IO;
4+
using System.Net;
25
using System.Net.Http;
6+
using System.Net.Security;
7+
using System.Threading;
8+
using System.Threading.Tasks;
39
using Yarp.ReverseProxy.Forwarder;
410

511
namespace HttpMouse.Implementions
612
{
713
/// <summary>
814
/// 反向连接的HttpClient工厂
915
/// </summary>
10-
sealed class ReverseHttpClientFactory : ForwarderHttpClientFactory, IForwarderHttpClientFactory
16+
sealed class ReverseHttpClientFactory : IForwarderHttpClientFactory, IDisposable
1117
{
18+
private readonly SocketsHttpHandler httpHandler;
1219
private readonly IReverseConnectionService reverseConnectionService;
20+
private readonly ILogger<ReverseHttpClientFactory> logger;
1321

1422
/// <summary>
1523
/// 反向连接的HttpClient工厂
1624
/// </summary>
1725
/// <param name="reverseConnectionService"></param>
1826
/// <param name="logger"></param>
1927
public ReverseHttpClientFactory(
20-
IReverseConnectionService reverseConnectionService,
21-
ILogger<ForwarderHttpClientFactory> logger)
22-
: base(logger)
28+
IReverseConnectionService reverseConnectionService, ILogger<ReverseHttpClientFactory> logger)
2329
{
2430
this.reverseConnectionService = reverseConnectionService;
31+
this.logger = logger;
32+
33+
this.httpHandler = new SocketsHttpHandler
34+
{
35+
UseProxy = false,
36+
UseCookies = false,
37+
AllowAutoRedirect = false,
38+
AutomaticDecompression = DecompressionMethods.None,
39+
ConnectCallback = this.ConnectCallback,
40+
SslOptions = new SslClientAuthenticationOptions
41+
{
42+
RemoteCertificateValidationCallback = delegate { return true; }
43+
}
44+
};
45+
}
46+
47+
/// <summary>
48+
/// 连接回调
49+
/// </summary>
50+
/// <param name="context"></param>
51+
/// <param name="cancellation"></param>
52+
/// <returns></returns>
53+
private async ValueTask<Stream> ConnectCallback(SocketsHttpConnectionContext context, CancellationToken cancellation)
54+
{
55+
try
56+
{
57+
return await this.reverseConnectionService.CreateReverseConnectionAsync(context, cancellation);
58+
}
59+
catch (Exception ex)
60+
{
61+
this.logger.LogWarning(ex.Message);
62+
throw;
63+
}
2564
}
2665

2766
/// <summary>
28-
/// 配置连接
67+
/// 创建HttpMessageInvoker
2968
/// </summary>
3069
/// <param name="context"></param>
31-
/// <param name="handler"></param>
32-
protected override void ConfigureHandler(ForwarderHttpClientContext context, SocketsHttpHandler handler)
70+
/// <returns></returns>
71+
public HttpMessageInvoker CreateClient(ForwarderHttpClientContext context)
72+
{
73+
return new HttpMessageInvoker(this.httpHandler, disposeHandler: false);
74+
}
75+
76+
/// <summary>
77+
/// 释放资源
78+
/// </summary>
79+
public void Dispose()
3380
{
34-
base.ConfigureHandler(context, handler);
35-
handler.ConnectCallback = this.reverseConnectionService.CreateReverseConnectionAsync;
81+
this.httpHandler.Dispose();
3682
}
3783
}
3884
}

0 commit comments

Comments
 (0)