地图监控改为固定双栏并可收起侧栏,编辑对齐改走内核 CAD,并接通 428 确认票。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -385,6 +385,13 @@ public class OpsController : ControllerBase
|
||||
try
|
||||
{
|
||||
var call = await CallLiteAsync(HttpMethod.Post, path, actor);
|
||||
if (TryReadConfirmTicket(call.Body, out var token))
|
||||
{
|
||||
call = await CallLiteAsync(HttpMethod.Post, path, actor, new Dictionary<string, string>
|
||||
{
|
||||
[ConfirmTokenHeader] = token
|
||||
});
|
||||
}
|
||||
var success = call.Ok && ParseSuccess(call.Body);
|
||||
return success
|
||||
? new ForwardOutcome(true, "ok", null)
|
||||
@@ -397,7 +404,32 @@ public class OpsController : ControllerBase
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<(bool Ok, int Status, string Body)> CallLiteAsync(HttpMethod method, string path, string? actor)
|
||||
private const string ConfirmTokenHeader = "X-Platform-Confirm-Token";
|
||||
|
||||
private static bool TryReadConfirmTicket(string body, out string token)
|
||||
{
|
||||
token = "";
|
||||
try
|
||||
{
|
||||
using var doc = JsonDocument.Parse(body);
|
||||
var root = doc.RootElement;
|
||||
var code = root.TryGetProperty("code", out var c) && c.TryGetInt32(out var n) ? n : 0;
|
||||
if (code != 428) return false;
|
||||
if (!root.TryGetProperty("data", out var data) || data.ValueKind != JsonValueKind.Object)
|
||||
return false;
|
||||
token = data.TryGetProperty("confirmToken", out var t) && t.ValueKind == JsonValueKind.String
|
||||
? t.GetString() ?? ""
|
||||
: "";
|
||||
return !string.IsNullOrWhiteSpace(token);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<(bool Ok, int Status, string Body)> CallLiteAsync(
|
||||
HttpMethod method, string path, string? actor, IReadOnlyDictionary<string, string>? extraHeaders = null)
|
||||
{
|
||||
var url = $"http://127.0.0.1:{_sl.ProjectionPort}{path}";
|
||||
using var client = _httpFactory.CreateClient();
|
||||
@@ -409,6 +441,14 @@ public class OpsController : ControllerBase
|
||||
msg.Headers.TryAddWithoutValidation("X-Platform-Confirmed", "1");
|
||||
if (!string.IsNullOrWhiteSpace(actor))
|
||||
msg.Headers.TryAddWithoutValidation("X-Platform-User", actor);
|
||||
if (extraHeaders != null)
|
||||
{
|
||||
foreach (var kv in extraHeaders)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(kv.Key) || kv.Value is null) continue;
|
||||
msg.Headers.TryAddWithoutValidation(kv.Key, kv.Value);
|
||||
}
|
||||
}
|
||||
using var resp = await client.SendAsync(msg);
|
||||
var body = await resp.Content.ReadAsStringAsync();
|
||||
return (resp.IsSuccessStatusCode, (int)resp.StatusCode, body);
|
||||
|
||||
Reference in New Issue
Block a user