使用 fetch 时强制 Tampermonkey HTTP 版本
Force Tampermonkey HTTP version when using fetch
我有一个调用 fetch 的简单测试 TamperMonkey (Firefox) 脚本。
脚本很简单。
(function() {
'use strict';
GM_registerMenuCommand("Test", postData);
})();
function postData(){
fetch('https://https://httpbin.org/post', {
method: 'POST',
headers: HEADERS,
body: JSON.stringify("{test:data}")
})
}
但是运行不同网站上的这个完全相同的脚本会给出不同的请求。
例如,在此处、Whosebug 和大多数网站上,它都会生成一个 HTTP/2 post
。并且有效。
(有趣的是,在某些网站上,它会首先发送一个 OPTIONS 请求。这不是问题,只是强调行为可能不同这一事实。)
在其他人(例如 Twitter)上,它将改为发送 HTTP/1.1 POST.
然后 API 以 202 响应并且没有任何反应(应该镜像的 post 数据不返回)
有没有办法控制 TamperMonkey 在发出请求时使用的 HTTP 版本?
===
根据@DraganS 的评论,我添加了 (Connection, upgrade)
和 (Upgrade, HTTP/2.0)
headers。
它们似乎没有被考虑在内(我在最终请求中没有看到 'Upgrade',并且 Connection
设置为 keep-alive
。
有趣的是,这使得之前没有发送 OPTIONS 请求的网站先行。
虽然不在 Twitter 上,但仍在 HTTP/1.1
===
编辑 2:我最初是在测试一个特定的 API,但更新到一个将请求发送到 httpbin 的完整测试脚本(应该只是镜像请求)具有完全相同的行为。
===
开始认为这与 TamperMonkey 无关。
我在 Firefox 中没有收到错误,但在控制台 Chrome 中,我只是执行
fetch('https://httpbin.org/post', {
method: 'POST',
body: JSON.stringify('{}')
})
在推特上 returns
Refused to connect to 'https://httpbin.org/post' because it violates the following Content Security Policy directive: "connect-src 'self' blob: https://*.giphy.com https://*.pscp.tv https://*.video.pscp.tv https://*.twimg.com https://api.twitter.com https://api-stream.twitter.com https://ads-api.twitter.com https://aa.twitter.com https://caps.twitter.com https://media.riffsy.com https://pay.twitter.com https://sentry.io https://ton.twitter.com https://twitter.com https://upload.twitter.com https://www.google-analytics.com https://accounts.google.com/gsi/status https://accounts.google.com/gsi/log https://app.link https://api2.branch.io https://bnc.lt wss://*.pscp.tv https://vmap.snappytv.com https://vmapstage.snappytv.com https://vmaprel.snappytv.com https://vmap.grabyo.com https://dhdsnappytv-vh.akamaihd.net https://pdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://dwo3ckksxlb0v.cloudfront.net".
所以原因可能是 Twitter CORS 政策?这是可以避免的吗?或者这是否意味着脚本不可能从 twitter.com 发出这些请求之外的请求?
在 Firefox 中看到的 HTTP 版本不同的事实可能只是一个副作用。
是否存在预检 OPTIONS 请求是正常行为。
错误是由于 CSP,而不是我最初认为的 CORS(我以前的很多错误都与 CORS 相关)。
解决方法:不使用fetch,而是GM.xmlhttpRequest函数。它可以绕过 CSP,但您不会在控制台中看到它。
我有一个调用 fetch 的简单测试 TamperMonkey (Firefox) 脚本。
脚本很简单。
(function() {
'use strict';
GM_registerMenuCommand("Test", postData);
})();
function postData(){
fetch('https://https://httpbin.org/post', {
method: 'POST',
headers: HEADERS,
body: JSON.stringify("{test:data}")
})
}
但是运行不同网站上的这个完全相同的脚本会给出不同的请求。
例如,在此处、Whosebug 和大多数网站上,它都会生成一个 HTTP/2 post
。并且有效。
(有趣的是,在某些网站上,它会首先发送一个 OPTIONS 请求。这不是问题,只是强调行为可能不同这一事实。)
在其他人(例如 Twitter)上,它将改为发送 HTTP/1.1 POST.
然后 API 以 202 响应并且没有任何反应(应该镜像的 post 数据不返回)
有没有办法控制 TamperMonkey 在发出请求时使用的 HTTP 版本?
===
根据@DraganS 的评论,我添加了 (Connection, upgrade)
和 (Upgrade, HTTP/2.0)
headers。
它们似乎没有被考虑在内(我在最终请求中没有看到 'Upgrade',并且 Connection
设置为 keep-alive
。
有趣的是,这使得之前没有发送 OPTIONS 请求的网站先行。
虽然不在 Twitter 上,但仍在 HTTP/1.1
===
编辑 2:我最初是在测试一个特定的 API,但更新到一个将请求发送到 httpbin 的完整测试脚本(应该只是镜像请求)具有完全相同的行为。
===
开始认为这与 TamperMonkey 无关。
我在 Firefox 中没有收到错误,但在控制台 Chrome 中,我只是执行
fetch('https://httpbin.org/post', {
method: 'POST',
body: JSON.stringify('{}')
})
在推特上 returns
Refused to connect to 'https://httpbin.org/post' because it violates the following Content Security Policy directive: "connect-src 'self' blob: https://*.giphy.com https://*.pscp.tv https://*.video.pscp.tv https://*.twimg.com https://api.twitter.com https://api-stream.twitter.com https://ads-api.twitter.com https://aa.twitter.com https://caps.twitter.com https://media.riffsy.com https://pay.twitter.com https://sentry.io https://ton.twitter.com https://twitter.com https://upload.twitter.com https://www.google-analytics.com https://accounts.google.com/gsi/status https://accounts.google.com/gsi/log https://app.link https://api2.branch.io https://bnc.lt wss://*.pscp.tv https://vmap.snappytv.com https://vmapstage.snappytv.com https://vmaprel.snappytv.com https://vmap.grabyo.com https://dhdsnappytv-vh.akamaihd.net https://pdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://dwo3ckksxlb0v.cloudfront.net".
所以原因可能是 Twitter CORS 政策?这是可以避免的吗?或者这是否意味着脚本不可能从 twitter.com 发出这些请求之外的请求?
在 Firefox 中看到的 HTTP 版本不同的事实可能只是一个副作用。
是否存在预检 OPTIONS 请求是正常行为。
错误是由于 CSP,而不是我最初认为的 CORS(我以前的很多错误都与 CORS 相关)。
解决方法:不使用fetch,而是GM.xmlhttpRequest函数。它可以绕过 CSP,但您不会在控制台中看到它。