XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.ServerInteractive

[DLL] Server interaction extension, including user identity verification and querying in conjunction with AutoConfig

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension.NetCore.ServerInteractive

支持按本地监听端口分发请求,兼容CDN回源端口

新增测试用例验证按端口分发Direct IP、DNS及EdgeOne请求。FindServerCore与BindingEndpoint方法签名增加localPort参数,确保分发时匹配实际监听端口,解决CDN/EdgeOne回源端口与公开端口不一致问题。同步更新所有相关调用。依赖XFEExtension.NetCore升级至5.2.1,csproj发布说明补充相关兼容性说明。

c0c66e2
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

3 个文件 +51 -10
Modified XFEExtension.NetCore.ServerInteractive.Test/CyberCommIntegrationTests.cs +39 -0
@@ -313,6 +313,45 @@ public sealed class CyberCommIntegrationTests
313 313 Assert.Equal(HttpStatusCode.NotFound, missingResponse.StatusCode);
314 314 }
315 315
316 [Fact]
317 public async Task ServerInteractive_RoutesDirectIpDnsAndEdgeOneRequestsByOriginPort()
318 {
319 var originPort = GetFreePort();
320 var core = XFEServerCoreBuilder.CreateBuilder()
321 .AddConnectService()
322 .Build(options =>
323 {
324 options.ServerCoreName = "edge-one-origin";
325 options.MainEntryPoint = "api";
326 options.AcceptGet = true;
327 options.BindIP($"http://*:{originPort}/");
328 });
329 await using var server = XFEServerBuilder.CreateBuilder()
330 .AddXFEExceptionProcess()
331 .AddXFECoreProcessor()
332 .AddServerCore(core)
333 .Build();
334 await server.StartAsync();
335
336 var directIpResponse = await SendRawAsync(originPort,
337 "GET /api/check_connect HTTP/1.1\r\n" +
338 $"Host: 127.0.0.1:{originPort}\r\n" +
339 "Connection: close\r\n\r\n");
340 var directDnsResponse = await SendRawAsync(originPort,
341 "GET /api/check_connect HTTP/1.1\r\n" +
342 $"Host: toolbox.api.xfe.studio:{originPort}\r\n" +
343 "Connection: close\r\n\r\n");
344 var edgeOneResponse = await SendRawAsync(originPort,
345 "GET /api/check_connect HTTP/1.1\r\n" +
346 "Host: toolbox.api.xfe.studio\r\n" +
347 "X-Forwarded-Proto: http\r\n" +
348 "Connection: close\r\n\r\n");
349
350 Assert.StartsWith("HTTP/1.1 200", directIpResponse);
351 Assert.StartsWith("HTTP/1.1 200", directDnsResponse);
352 Assert.StartsWith("HTTP/1.1 200", edgeOneResponse);
353 }
354
316 355 [Fact]
317 356 public async Task TableRequester_AcceptsCreatedAndUsesPageSize()
318 357 {
Modified XFEExtension.NetCore.ServerInteractive/Utilities/Server/XFEServerCoreHost.cs +8 -8
@@ -127,7 +127,7 @@ internal sealed class XFEServerCoreHost
127 127 private async ValueTask ProcessHttpRequestAsync(CyberCommHttpRequestContext context, CancellationToken cancellationToken)
128 128 {
129 129 var args = CyberCommRequestEventArgs.FromContext(context);
130 var serverCore = FindServerCore(context.RequestUri);
130 var serverCore = FindServerCore(context.RequestUri, context.LocalPort);
131 131 if (serverCore is null)
132 132 {
133 133 var entryPoint = XFEServerCore.GetRequestSegments(context.RequestUri).FirstOrDefault() ?? "<空>";
@@ -172,8 +172,8 @@ internal sealed class XFEServerCoreHost
172 172 }
173 173 }
174 174
175 private XFEServerCore? FindServerCore(Uri requestUrl) => _serverCores
176 .Where(core => _bindingEndpoints[core].Any(endpoint => endpoint.Matches(requestUrl)))
175 private XFEServerCore? FindServerCore(Uri requestUrl, int localPort) => _serverCores
176 .Where(core => _bindingEndpoints[core].Any(endpoint => endpoint.Matches(requestUrl, localPort)))
177 177 .Select(core => (Core: core, Matches: core.TryGetRoute(requestUrl, out _)))
178 178 .Where(item => item.Matches)
179 179 .OrderByDescending(item => item.Core.MainEntryPointSegmentCount)
@@ -190,21 +190,21 @@ internal sealed class XFEServerCoreHost
190 190 private ValueTask CyberCommServerClientConnectedAsync(CyberCommServerEventArgs e, CancellationToken cancellationToken)
191 191 {
192 192 cancellationToken.ThrowIfCancellationRequested();
193 if (e.RequestUrl is not null) FindServerCore(e.RequestUrl)?.NotifyClientConnected(CyberCommServer, e);
193 if (e.RequestUrl is not null) FindServerCore(e.RequestUrl, e.LocalPort)?.NotifyClientConnected(CyberCommServer, e);
194 194 return ValueTask.CompletedTask;
195 195 }
196 196
197 197 private ValueTask CyberCommServerMessageReceivedAsync(CyberCommServerEventArgs e, CancellationToken cancellationToken)
198 198 {
199 199 cancellationToken.ThrowIfCancellationRequested();
200 if (e.RequestUrl is not null) FindServerCore(e.RequestUrl)?.NotifyMessageReceived(CyberCommServer, e);
200 if (e.RequestUrl is not null) FindServerCore(e.RequestUrl, e.LocalPort)?.NotifyMessageReceived(CyberCommServer, e);
201 201 return ValueTask.CompletedTask;
202 202 }
203 203
204 204 private ValueTask CyberCommServerConnectionClosedAsync(CyberCommServerEventArgs e, CancellationToken cancellationToken)
205 205 {
206 206 cancellationToken.ThrowIfCancellationRequested();
207 if (e.RequestUrl is not null) FindServerCore(e.RequestUrl)?.NotifyConnectionClosed(CyberCommServer, e);
207 if (e.RequestUrl is not null) FindServerCore(e.RequestUrl, e.LocalPort)?.NotifyConnectionClosed(CyberCommServer, e);
208 208 return ValueTask.CompletedTask;
209 209 }
210 210
@@ -229,9 +229,9 @@ internal sealed class XFEServerCoreHost
229 229 return new(uri.Scheme.ToLowerInvariant(), host.ToLowerInvariant(), uri.Port);
230 230 }
231 231
232 public bool Matches(Uri requestUri) =>
232 public bool Matches(Uri requestUri, int localPort) =>
233 233 Scheme.Equals(requestUri.Scheme, StringComparison.OrdinalIgnoreCase) &&
234 Port == requestUri.Port &&
234 Port == localPort &&
235 235 (Host == "*" || Host.Equals(requestUri.IdnHost, StringComparison.OrdinalIgnoreCase));
236 236
237 237 public bool Overlaps(BindingEndpoint other) =>
Modified XFEExtension.NetCore.ServerInteractive/XFEExtension.NetCore.ServerInteractive.csproj +4 -2
@@ -7,7 +7,7 @@
7 7 <GenerateDocumentationFile>True</GenerateDocumentationFile>
8 8 <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
9 9 <NoWarn>$(NoWarn);CS1591;CS8669</NoWarn>
10 <Version>4.0.0</Version>
10 <Version>4.0.1</Version>
11 11 <Title>XFEExtension.NetCore.ServerInteractive</Title>
12 12 <RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.ServerInteractive</RepositoryUrl>
13 13 <AnalysisLevel>latest</AnalysisLevel>
@@ -25,6 +25,8 @@
25 25
26 26 4.0 使用自研 CyberComm Socket/TLS/HTTP/1.1/WebSocket 传输层,并提供跨平台可取消生命周期。
27 27
28 核心服务器按实际本地监听端口分发请求,兼容 EdgeOne/CDN 的公开端口与回源端口不同的场景。
29
28 30 ## 新增
29 31
30 32 支持多个核心服务器绑定同一端口,并通过不同的 MainEntryPoint 区分;同端口同入口配置会在启动时直接报错。
@@ -61,7 +63,7 @@
61 63 </ItemGroup>
62 64
63 65 <ItemGroup>
64 <PackageReference Include="XFEExtension.NetCore" Version="5.2.0" />
66 <PackageReference Include="XFEExtension.NetCore" Version="5.2.1" />
65 67 <PackageReference Include="XFEExtension.NetCore.AutoConfig" Version="4.1.0" />
66 68 <PackageReference Include="XFEExtension.NetCore.AutoImplement" Version="1.1.0" />
67 69 <PackageReference Include="XFEExtension.NetCore.XFEConsole" Version="2.5.0" />