javascript - 我可以将 Content-Length header 注入(inject) Chrome 吗?

标签 javascript google-chrome google-chrome-extension

我正在尝试制作我的第一个 Chrome 扩展程序,这是一次很好的学习经历。我快完成了,但是这最后一 block 让我难受。

我知道 Google 不希望您使用 Content-Length(如所述 here ),但我正在使用一个 API,当我 POST 时,该 API 的身份验证需要它。 This extension说它可以做到,但我觉得我写的应该有效。最近是否在新版本的 Chrome 中屏蔽了此功能?

这些是我发送的 header :

{
    "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” header ,但它工作正常(我可以看到 onSendHeaders、onHeadersReceived 等)。一切都已更换,响应符合预期。但是当我使用“rh-Content-Length”发出 POST 请求时,我只看到 onSendHeaders,之后什么也没有。

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

最佳答案

好的,我是在凌晨 3:00 发布的。经过急需的 sleep 后,我今天早上醒来并与 friend 谈论了这件事。他指出错误实际上是在我的ajax调用中。我修复了这个问题,现在我可以从我的分机发送内容长度。上面的代码确实有效。

我上面发布的代码的一些注释,供以后搜索此内容的人使用:

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

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

  • 授权
  • 缓存控制
  • 连接
  • 内容长度
  • 主持人
  • 如果-修改-自
  • 如果不匹配
  • If-范围
  • 部分数据
  • 编译指示
  • 代理授权
  • 代理连接
  • 传输编码

希望这有帮助。

关于javascript - 我可以将 Content-Length header 注入(inject) Chrome 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29789841/

相关文章:

javascript - Jquery load() 只在 Firefox 中工作?

javascript - chrome 使用 execCommand 添加回车符 ('copy' )

javascript - 如何在 google chrome 中运行自己的 javascript

javascript - 如何从 promise 中获取值(value)?

javascript - 如何使用 vanillaJS 在 <body> 标签上切换 CSS 类 - 无 JQuery

javascript - 如何检查富文本编辑器内容是否为空?

javascript - Lodash toString() 和 JavaScript 的原生 toString() 方法有什么区别?

javascript - 如何让 js2-mode 在 Emacs 中使用空格而不是制表符?

javascript - 检测从休眠状态唤醒

javascript - "TypeError: Cannot read property ' 在后台页面查询 ' of undefined"的 chrome.tab.query