fix(browser): M53 追加 Chrome 输出预览打码
preview() 出镜前过 trace.RedactTextLimited(600 rune),覆盖失败日志的 chrome_output 与 withChromeOutput 追加给调用方的错误串;补凭据形状/原话可见/有界三条测试,删实现可打红。
This commit is contained in:
1 parent
8058660537
commit
b040f588b2
4 files changed
+209
-6
No files matched your search
@@ -20,10 +20,12 @@ const (
|
||||
// 的落地前提是「看得见失败」—— 启动失败时浏览器把原因写在自己的 stdout/stderr 上
|
||||
// (参数被拒、profile 锁、崩溃),不接住它,日志里就只剩我们这一侧的猜测。
|
||||
//
|
||||
// 两条口径:
|
||||
// 三条口径:
|
||||
//
|
||||
// - **有界**:只留前 N 字节 / 上报前 N 行。正常启动时 Chrome 也会往 stderr 写常规
|
||||
// 信息,全打进日志就是刷屏;缓存也无上限地吃内存。
|
||||
// - **打码**:这是浏览器可控的自由文本,出镜前必过 chromeOutputPreview(凭据形状
|
||||
// 打码 + rune 上限,见 errtext.go)。它进的不只是日志,还有用户侧的工具结果。
|
||||
// - **不主动打**:本类型只缓存,**不输出**。成功时只报字节数(Debug),失败时由
|
||||
// `localChrome.Dial` 一次性把前 N 行与本次 argv 一起报出来(见 launch.go)。
|
||||
type chromeOutput struct {
|
||||
@@ -65,6 +67,13 @@ func (o *chromeOutput) totalBytes() int {
|
||||
// preview 返回失败上报用的「前 N 行」:每行内的空白压成单空格、空行去掉;被截断时
|
||||
// 在末尾点明**截断与总字节数**(绝不把半截输出说得像完整输出)。没有输出时返回空串,
|
||||
// 调用方据此判断「浏览器一个字都没说」。
|
||||
//
|
||||
// 🔴 正文出镜前必过 chromeOutputPreview(凭据形状打码 + 600 rune 上限,见 errtext.go):
|
||||
// 这个字符串**是浏览器可控的自由文本**,而它会同时进失败日志与**返回给调用方的错误串**
|
||||
// (launchOnce ⇒ 用户侧工具结果)。真机上 Chromium 会把本次 argv、被拒的参数、地址原话
|
||||
// 打出来 —— 一旦里面出现 `?access_token=` 或 `Bearer ...`,原样透出就是凭据落进日志与
|
||||
// 模型上下文。上限只压正文:下面的「已截断,共 N 字节」后缀是我们自己的定长说明,不进
|
||||
// 这份预算,因此截断与量级都照实可见。
|
||||
func (o *chromeOutput) preview() string {
|
||||
o.mu.Lock()
|
||||
raw := truncateRune(o.head)
|
||||
@@ -84,7 +93,9 @@ func (o *chromeOutput) preview() string {
|
||||
break
|
||||
}
|
||||
}
|
||||
text := strings.Join(kept, " | ")
|
||||
// 先拼再清洗(而不是逐行清洗):跨行的凭据形状(`access_token=` 与值被换行拆开)
|
||||
// 只有拼起来之后才看得见。
|
||||
text := chromeOutputPreview(strings.Join(kept, " | "))
|
||||
if truncated && text != "" {
|
||||
text += " | ...(已截断,共 " + strconv.Itoa(total) + " 字节)"
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user