如何使用webRequest.onHeadersRecieved修改响应头?

时间:2018-02-22 15:08:21

标签: google-chrome-extension firefox-addon

我正在编写一个扩展程序,可让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。

1 个答案:

答案 0 :(得分:0)

部分答案:根据定义HTTP 1.1的RFC 2616,HTTP状态不是标头。状态是它自己的东西,称为状态行。并且它在文本上看起来确实不同,因为它没有键:前缀,与标题中的其他内容不同。

至于为什么我的自定义标题没有显示在网络监视器中,我不确定。也许它是devtools中的一个错误,或其他东西。

无论如何,无论是否正式标题,Chrome webRequest API都会将其公开为&#34; status&#34;标题,我相信它应该支持以与其他标题一致的方式进行修改。