Javascript 为什么';Icecast对';选项';浏览器在飞行前检查CORS时发送的请求?

Javascript 为什么';Icecast对';选项';浏览器在飞行前检查CORS时发送的请求?,javascript,cors,icecast,Javascript,Cors,Icecast,我正在为Icecast流开发一个播放器,并试图从该流中获取元数据。当流位于stream.example.fm/93.mp3时,播放器将打开example.fm 根据Icecast文档,我需要在流中接收元数据的请求中包含ICE MetaData:1头。当我包含该标题时,问题就出现了 简单获取可以工作,但不使用标头 一个简单的请求,例如fetch(“https://stream.example.fm/96.mp3“”返回有效的200响应 但该代码不起作用: let Heads = new Heade

我正在为Icecast流开发一个播放器,并试图从该流中获取元数据。当流位于
stream.example.fm/93.mp3
时,播放器将打开
example.fm

根据Icecast文档,我需要在流中接收元数据的请求中包含
ICE MetaData:1
头。当我包含该标题时,问题就出现了

简单获取可以工作,但不使用标头

一个简单的请求,例如
fetch(“https://stream.example.fm/96.mp3“”
返回有效的200响应

但该代码不起作用:

let Heads = new Headers({
        "Icy-MetaData": "1"
      });
      fetch("https://stream.example.fm/96.mp3", {
          headers: Heads
        })
验证服务器标题

执行
curl-H“Ice元数据:1”-v”https://stream.example.fm/96.mp3“>/dev/null
确认

Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Icy-MetaData
在流式服务器的标头中显示

飞行前检查

问题似乎在于浏览器发送的飞行前检查“选项”请求。自定义标头会触发此操作。我用curl做了一个测试:

curl -i -X OPTIONS https://stream.example.fm/96.mp3 -H 'Access-Control-Request-Method: GET' -H 'Access-Control-Request-Headers: icy-metadata' -H 'Origin: https://example.fm'
我得到一个错误:

curl:(52)来自服务器的空回复


这是Icecast错误还是我的服务器配置中遗漏了什么?

您是否检查了您的请求是否不包含其他不允许的头文件?只是验证了将案例修复为匹配不会帮助chrome中的网络选项卡仅显示
Ice metadata:1
头文件。是的,通常情况下,实现会通过转到“全部较低”或“全部较高”来实现大小写不敏感。不是对问题的有用描述。它以什么方式失败?您暗示问题与CORS相关:记录了哪些与CORS相关的错误消息?“网络”选项卡为请求和响应显示了什么?您是否检查了您的请求不包括其他不允许的标题?只是验证了将案例修复为匹配不会帮助chrome中的“网络”选项卡仅显示
icy metadata:1
标题。是的,通常情况下,实现会通过转到“全部较低”或“全部较高”来实现大小写不敏感。不是对问题的有用描述。它以什么方式失败?您暗示问题与CORS相关:记录了哪些与CORS相关的错误消息?网络选项卡为请求和响应显示了什么?