【问题标题】:How to intercept HTTP OPTIONS calls made by the browser如何拦截浏览器发出的 HTTP OPTIONS 调用
【发布时间】:2020-01-16 01:11:06
【问题描述】:

我有一个用例,我想拦截和记录 HTTP OPTIONS 调用。我知道这些是作为 CORS 的一部分由浏览器完成的

我尝试过对 XMLHttpRequest 进行monkeypatching,还尝试过通过“fetch”事件拦截的 service-worker。

但是我只能捕获非 OPTIONS 调用(GET、PUT、POST)

如何拦截 OPTIONS 调用?我清楚地看到它们是在网络标签中完成的

【问题讨论】:

  • 我认为你做不到。这发生在浏览器内部,它不是公开的 API。
  • @Barmar,如果是这样,您知道如何将任何遥测数据添加到 CORS 请求中吗?想象一下我做了一个 CORS 请求并且 OPTIONS 调用失败了,我应该怎么知道它失败的原因?
  • 我不确定,但我认为XMLHttpRequest.status 将包含来自OPTIONS 调用的错误代码。
  • @Barmar 谢谢,如果可能的话,你能链接我的文档吗?我也会尝试自己复制一下,看看是否属实
  • 对不起,不知道是否或在哪里记录了这一点。但我只是假设如果您收到 CORS 错误,它将反映在 XHR 的状态中。它还会去哪里?

标签: javascript browser cors service-worker


【解决方案1】:

CORS 预检请求作为浏览器安全实现硬编码到浏览器中,不会通过可编程 API 向我们公开。从本质上讲,拦截或更改预检请求可能会否定 CORS 本身的安全性。

因为 OPTIONS 请求在 Chrome 开发工具网络选项卡中可用,您可以使用 Puppeteer,它使用 Chrome 开发工具协议来访问较低级别的网络请求。 page.setRequestInterception() 将捕获 OPTIONS 请求。

ma​​in.mjs

import puppeteer from 'puppeteer';

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.on('request', debugRequest);

  await page.setRequestInterception(true);

  await page.evaluate(() => {
    // custom request headers should force preflight CORS requests
    // (see https://www.w3.org/TR/cors/#resource-preflight-requests)
    fetch('https://example.com', {
      headers: {
        'force-preflight-request': null
      }
    });
  })

  await browser.close();
})()

function debugRequest(request) {
  console.log(request.method(), request.url())
}

【讨论】:

  • 感谢您的回答!据我了解,这是假设您可以正确控制浏览器?因此,在尝试构建客户端代码时无法使用此解决方案,因为您无法控制浏览器但是我想这在构建例如某些端到端测试时会起作用?
  • 正确。我刚刚提交了#1498,规范作者可能会发表评论或澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2020-11-08
  • 2015-03-04
  • 2023-03-18
  • 2011-02-04
相关资源
最近更新 更多