我可以将 Content-Length header 注入 Chrome 吗?

Can I inject a Content-Length header into Chrome?

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

我知道 Google 不希望您使用 Content-Length(如前所述 here), but I'm working with an API who's authentication requires it when I POST. This extension 说它可以做到,但我觉得我写的应该有用。这是最近在新版本 Chrome?

中被屏蔽

这些是我要发送的 header:

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

这是用新的 header 替换 "rh" header 的部分(所有带有 "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 都有新格式的 headers。

好的,所以我在 3:00 上午发布了它。在获得了一些急需的睡眠之后,我今天早上醒来并与一位朋友谈论了这件事。他指出错误实际上是在我的 ajax 调用中。我修复了这个问题,现在我可以从我的分机发送 Content-Length 了。上面的代码确实有效。

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

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

虽然没有测试,但它应该适用于其他 headers,Chrome 说它不会通过。这是 headers Google 的列表,表示它没有在 onBeforeSendHeaders 中提供(如记录 here):

  • 授权
  • Cache-Control
  • 连接
  • Content-Length
  • 主持人
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • Partial-Data
  • 编译指示
  • Proxy-Authorization
  • Proxy-Connection
  • Transfer-Encoding

希望对您有所帮助。