Commit 98731db
committed
feat: PWA service worker 拦截主文档时用 HEAD fetch 兜底拉响应头
诊断 nodeseek.com 响应头一直为 0 时跑了一段临时 webRequest listener,硬刷新页面后 console 输出全是 type=xmlhttprequest tabId=-1,**没有 main_frame**。这说明 nodeseek 注册了网站自己的 service worker(PWA),主文档 navigation 被 SW 的 fetch handler 拦截后用 cache 返回——chrome.webRequest 文档明确写过:当 service worker 用 respondWith 返回非网络响应时,onHeadersReceived 不触发。这是 chrome 平台行为,不是我们代码问题。
不能改 chrome,只能扩展自己兜底拉响应头。新增 fetchMainHeadersFallback:
fetch(url, { method: 'HEAD', credentials: 'omit', cache: 'no-store', redirect: 'follow' })
扩展 service worker 在扩展上下文跑,发起的 fetch 不会被网站 service worker 拦截(两个 SW 隔离),直接走真实网络。HEAD 请求只取 header 不要 body,省带宽。如果 HEAD 返回非 200/405(少数站不支持 HEAD),降级到 GET 重试,依然只读 header 不读 body 让 GC 回收。
response.headers.forEach 转成 chrome.webRequest details 兼容的 [{name,value}] 数组,喂给现有 buildHeaderRecord 复用 normalizeHeaders / pickHeaders / detectFromHeaders 整套链路,输出与正常 webRequest 路径完全一致的 record,包括 normalizedHeaderCount 字段。
调用时机放在 runActivePageDetection 里 page-detector 跑完之后:检查 data.main 是不是空,空就拿 page.url 去 fallback fetch 一次。这样:
- webRequest 正常拿到响应头的站(绝大多数):data.main 已存在,跳过 fallback,零额外请求
- service worker 拦截主文档的 PWA(nodeseek / Twitter Web App / 一些 vue-pwa 站):data.main 为空,触发 HEAD fetch 兜底,用户看到的响应头数从 0 变成真实数字
- credentials: 'omit' 不带页面 cookie,可能与浏览器实际请求看到的响应头有细微差异(比如登录态相关的 Set-Cookie),但 server / x-powered-by / cf-ray / content-type 等共性技术线索 header 是一致的,足够识别用
插件版本升级到 1.1.4。1 parent a03ab7f commit 98731db
3 files changed
Lines changed: 34 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
| |||
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
56 | 63 | | |
57 | 64 | | |
58 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
115 | 141 | | |
116 | 142 | | |
117 | 143 | | |
| |||
0 commit comments