我正在编写一个扩展程序,可让Chrome(和Firefox)用户有选择地修改响应标头。主要是QA人员测试前端是否正确处理错误模式(例如,如果给定路由返回500,则显示正确的对话框)。
此实现使用Chrome webRequest API。我知道扩展正在加载,我可以使用listener1
阻止请求。但是,listener2
的行为不符合预期,因为它既不修改状态代码也不添加 josh 标头。我已在Chrome的网络监视器标签中对此进行了验证。两个过滤器都可以正常工作(我使用显式的https过滤器进行测试,因为我知道webRequest API不适用于file://
网址。)
作为我的问题排查过程的一部分,我已停用所有其他Chrome扩展程序,因此我非常确定没有其他内容正在修改标题。
let count = 0;
function listener1(details){
return {cancel: true};
}
function listener2(details){
console.log(count++, details);
if (!details) return;
for (let i = 0; i < details.responseHeaders.length; i++){
if (details.responseHeaders[i].name === 'status'){
details.responseHeaders[i].value = '500';
break;
}
}
details.responseHeaders.push({name: 'josh', value: 'count: ' + count});
// Response is of type "Blocking Response"
return {responseHeaders: details.responseHeaders};
}
const filter1 = '<all_urls>';
const filter2 = 'https://www.google.com/'
chrome.webRequest.onHeadersReceived.addListener(listener2, { urls: [filter2] }, ['blocking', 'responseHeaders']);
这是我的清单:
{
"name": "Server Error Simulation Extension",
"description" : "Base Level Extension",
"version": "1.0",
"manifest_version": 2,
"browser_action": {
"default_popup": "popup.html",
"default_icon": "logo.png"
},
"background": {
"persistent": true,
"scripts": ["background.js"]
},
"permissions": [
"activeTab",
"storage",
"webRequest",
"webRequestBlocking",
"*://*.com/"
]
}
请注意,我只想修改标头,因此Chrome bug about modifying response bodies不适用。另外,Firefox copied this API from Chrome所以我也标记了Firefox。
答案 0 :(得分:0)
部分答案:根据定义HTTP 1.1的RFC 2616,HTTP状态不是标头。状态是它自己的东西,称为状态行。并且它在文本上看起来确实不同,因为它没有键:前缀,与标题中的其他内容不同。
至于为什么我的自定义标题没有显示在网络监视器中,我不确定。也许它是devtools中的一个错误,或其他东西。
无论如何,无论是否正式标题,Chrome webRequest API都会将其公开为&#34; status&#34;标题,我相信它应该支持以与其他标题一致的方式进行修改。