【问题标题】:Can I inject a Content-Length header into Chrome?我可以将 Content-Length 标头注入 Chrome 吗?
【发布时间】:2016-08-08 03:38:56
【问题描述】:

我正在尝试制作我的第一个 Chrome 扩展程序,这是一次很好的学习体验。我快完成了,但最后一段让我很生气。

我知道 Google 不希望您使用 Content-Length(如 here 所述),但我正在使用一个 API,当我发布时它的身份验证需要它。 This extension 说可以,但我觉得我写的应该可以。这最近在新版本的 Chrome 中被阻止了吗?

这些是我要发送的标头:

{
    "ReplaceHeaders": true,
    "rh-Authentication": "<my auth token>",
    "rh-Timestamp": "<timestamp>",
    "rh-Content-Length": body.length
}

这是用新标头替换“rh”标头的部分(所有内容都带有“rh-”,如果有意义的话,“rh-”除外。):

chrome.webRequest.onBeforeSendHeaders.addListener(function(data) {
    newHeaders = false;

    _.find(data.requestHeaders, function(header) {
        if ((header.name === "ReplaceHeaders") && (header.value)) {
            _.find(data.requestHeaders, function(h) {
                if (h.name.substring(0, 3) === "rh-") {
                    if (newHeaders === false) { newHeaders = []; }
                    newHeaders.push({
                        name: h.name.substring(3, h.name.length),
                        value: h.value
                    });
                }
            });
            return;
        }
    });

    if (!!newHeaders) {
        // Update headers
        return {requestHeaders: newHeaders};
    }
}, { urls: ["<all_urls>"] }, ["requestHeaders", "blocking"]);

当我发出 GET 请求时,我没有“rh-ContentLength”标头,它工作正常(我可以看到 onSendHeaders、onHeadersReceived 等)。一切都被替换,响应如预期。但是当我使用“rh-Content-Length”发出 POST 请求时,我只看到 onSendHeaders,之后什么也没有。

我的 GET 和 POST 的 onSendHeaders 都有新格式化的标题。

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension


    【解决方案1】:

    好的,所以我在凌晨 3:00 发布了。在得到了一些急需的睡眠后,我今天早上醒来并和一个朋友谈了这件事。他指出错误实际上是在我的 ajax 调用中。我解决了这个问题,现在我可以从我的扩展发送 Content-Length。上面的代码确实有效。

    我在上面发布的代码的一些注释供以后搜索此代码的任何人使用:

    • 我正在使用underscore 循环遍历数组
    • 这会去除所有其他标题,只添加以“rh-”开头的标题。你可能想要也可能不想要。
    • 您必须将 ["requestHeaders", "blocking"] 作为 onBeforeSendHeaders.addListener() 中的最后一个参数
    • 在您的 manifest.json 权限中确保您拥有“webRequest”和“webRequestBlocking”

    虽然未经测试,但这应该适用于 Chrome 表示不会通过的其他标头。以下是 Google 表示在 onBeforeSendHeaders 中未提供的标头列表(如文档中的 here 所述):

    • 授权
    • 缓存控制
    • 连接
    • 内容长度
    • 主机
    • If-Modified-Since
    • 如果没有匹配
    • If 范围
    • 部分数据
    • 编译指示
    • 代理授权
    • 代理连接
    • 传输编码

    希望这会有所帮助。

    【讨论】:

    • 太棒了,这确实有效。即使 Google 没有按照文档中的说明提供对这些标头的读取访问权限,仍然允许写入访问权限。换句话说,e.requestHeaders.push({'name': 'Content-Length','value': '123'});e.requestHeaders.push({'name': 'Host', 'value': 'asdfghhjjk'}); 等其他人一起工作
    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2012-06-12
    • 2021-06-14
    • 1970-01-01
    相关资源
    最近更新 更多