使用 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,但您不会在控制台中看到它。