我可以将 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
希望对您有所帮助。
我正在尝试制作我的第一个 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
希望对您有所帮助。