Skip to content

Commit 662a5ac

Browse files
committed
🔨 优化脚本注入路径为同源,修复github加速在启用脚本的情况下出现异常
1 parent f422c76 commit 662a5ac

File tree

6 files changed

+51
-24
lines changed

6 files changed

+51
-24
lines changed

src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services.Implementation/HttpServer/Middleware/HttpLocalRequestMiddleware.cs

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ public HttpLocalRequestMiddleware(
3030
/// <returns></returns>
3131
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
3232
{
33+
if (TryGetInjectScriptLocalId(context.Request.Path, out var injectScriptLid))
34+
{
35+
await HandleScriptRequestAsync(context, injectScriptLid);
36+
return;
37+
}
38+
3339
if (HttpMethods.IsOptions(context.Request.Method) && context.Request.Headers.ContainsKey("Access-Control-Request-Private-Network"))
3440
{
3541
// https://wicg.github.io/private-network-access/
@@ -60,34 +66,50 @@ public async Task InvokeAsync(HttpContext context, RequestDelegate next)
6066
await HandleHttpRequestAsync(context);
6167
return;
6268
default: //默认处理脚本匹配
63-
if (!int.TryParse(context.Request.Path.Value?.Trim('/'), out var lid) && lid <= 0)
64-
{
65-
await Handle404NotFoundAsync(context);
66-
return;
67-
}
68-
// TODO: Scripts
69-
if (reverseProxyConfig.TryGetScriptContent(lid, out string? content))
70-
{
71-
if (string.IsNullOrEmpty(content))
72-
{
73-
await Handle404NotFoundAsync(context);
74-
return;
75-
}
76-
context.Response.Headers.ContentType = "text/javascript;charset=UTF-8";
77-
await context.Response.WriteAsync(content);
78-
return;
79-
}
80-
else
69+
if (!int.TryParse(context.Request.Path.Value?.Trim('/'), out var lid) || lid <= 0)
8170
{
8271
await Handle404NotFoundAsync(context);
8372
return;
8473
}
74+
await HandleScriptRequestAsync(context, lid);
75+
return;
8576
}
8677
}
8778

8879
await next(context);
8980
}
9081

82+
static bool TryGetInjectScriptLocalId(PathString path, out int localId)
83+
{
84+
localId = default;
85+
var pathValue = path.Value;
86+
if (string.IsNullOrEmpty(pathValue))
87+
return false;
88+
89+
var prefix = IReverseProxyService.Constants.InjectScriptPathPrefix;
90+
if (!pathValue.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
91+
return false;
92+
93+
var idPart = pathValue[prefix.Length..];
94+
if (!idPart.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
95+
return false;
96+
97+
idPart = idPart[..^3];
98+
return int.TryParse(idPart, out localId) && localId > 0;
99+
}
100+
101+
async Task HandleScriptRequestAsync(HttpContext context, int lid)
102+
{
103+
if (reverseProxyConfig.TryGetScriptContent(lid, out var content) && !string.IsNullOrEmpty(content))
104+
{
105+
context.Response.Headers.ContentType = "application/javascript;charset=UTF-8";
106+
await context.Response.WriteAsync(content);
107+
return;
108+
}
109+
110+
await Handle404NotFoundAsync(context);
111+
}
112+
91113
/// <summary>
92114
/// 处理脚本所需要的 HTTP 请求
93115
/// </summary>

src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services.Implementation/HttpServer/Middleware/HttpReverseProxyMiddleware.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,8 @@ async Task WriteAsync(Stream bodyCoreWriter)
350350
// var html_start_string = encoding.GetString(html_start.Span);
351351
//#endif
352352
await bodyCoreWriter.WriteAsync(html_start);
353-
ReadOnlyMemory<byte> script_xml_start = "<script type=\"text/javascript\" src=\"https://local.steampp.net/"u8.ToArray();
354-
ReadOnlyMemory<byte> script_xml_end = "\"></script>"u8.ToArray();
353+
var script_xml_start = Encoding.ASCII.GetBytes($"<script type=\"text/javascript\" src=\"{IReverseProxyService.Constants.InjectScriptPathPrefix}");
354+
ReadOnlyMemory<byte> script_xml_end = ".js\"></script>"u8.ToArray();
355355
foreach (var script in scripts)
356356
{
357357
await bodyCoreWriter.WriteAsync(script_xml_start);

src/BD.WTTS.Client.Plugins.Accelerator.ReverseProxy/Services/IReverseProxyService.Constants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ static class Constants
3434

3535
public const string LocalDomain = "local.steampp.net";
3636

37+
/// <summary>
38+
/// 同源脚本注入路径前缀,避免使用外域 script src 造成页面脚本 publicPath 污染。
39+
/// </summary>
40+
public const string InjectScriptPathPrefix = "/WattToolkit_Inject/";
41+
3742
public static IPAddress DefaultProxyIp => IPAddress.Any;
3843
}
3944

src/BD.WTTS.Client.Plugins.SteamIdleCard/UI/ViewModels/IdleCardPageViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ async Task RunLoadBadges()
414414
HandleBadges:
415415
Badges.Clear();
416416
Badges.Add(badges!);
417-
await RefreshPrivateGameAppIds(steam_id);
417+
//await RefreshPrivateGameAppIds(steam_id);
418418
TotalCardsRemaining = 0;
419419
TotalCardsAvgPrice = 0;
420420

src/BD.WTTS.UnitTest/HttpReverseProxyMiddlewareUnitTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ public void TestFindScriptInjectInsertPosition()
3232
Assert.That(position, Is.GreaterThan(0));
3333

3434
var html_start = buffer[..position];
35-
var script_xml_start = "<script type=\"text/javascript\" src=\"https://local.steampp.net/"u8.ToArray();
36-
var script_xml_end = "\"></script>"u8.ToArray();
35+
var script_xml_start = "<script type=\"text/javascript\" src=\"/.watt-toolkit-inject/"u8.ToArray();
36+
var script_xml_end = ".js\"></script>"u8.ToArray();
3737

3838
using var s = new MemoryStream();
3939
s.Write(html_start);

0 commit comments

Comments
 (0)