【问题标题】:Icecast2 - how to add access-control-allow-origin header?Icecast2 - 如何添加访问控制允许来源标头?
【发布时间】:2014-07-26 12:48:04
【问题描述】:

我正在尝试使用使用 XHR 的 Dancer.js 从我的 icecast2 服务器流式传输音乐。

但是,目前我遇到了错误(将实际域替换为 example.com):

XMLHttpRequest cannot load http://example.com:8000/stream.ogg. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access.

我一直在寻找有关如何向流中添加自定义标头的信息,但找不到任何相关信息。

如何将 access-control-allow-origin 标头添加到此流中?

我看到一些 anwsers 告诉我将其添加到 apache 配置或 .htaccess 中,但由于这没有使用无法工作的 apache 服务。

谢谢。

【问题讨论】:

  • 我认为有一种方法可以在 Icecast 中添加标题,但我不记得了。如果你没有得到这个工作,CORS 标头在我自己的服务器 AudioPump 中是标准的。如果您想尝试一下,请发送电子邮件至 brad@audiopump.co

标签: http-headers xmlhttprequest debian icecast


【解决方案1】:

正确的™ 方法是升级到 Icecast 2.4.1,该版本明确添加了此功能以帮助使用它的(固定)JSON API 和 HTML5 功能。

软件包可用于大多数发行版。见http://icecast.org

【讨论】:

  • 很高兴知道他们添加了它,当我问这个问题时,绝对没有简单的方法可以做到这一点
  • 是的,只是想添加这个,这样如果有人偶然发现这个问题,他们就有机会采取简单的方法。 ;-)
  • 我刚刚又搜索了一遍,结果又回到了我自己的问题 xD 很高兴你添加了该信息哈哈
【解决方案2】:

您可以将 Access-Control-Allow-Origin 标头添加到 Icecast 中继的客户端响应中 通过在util.c 的 util_http_build_header 函数中添加您的标头以下行。

查看 contenttype_buffer 之后的"Access-Control-Allow-Origin: http://foo.example\r\n",

ret = snprintf (out, len, "%sServer: %s\r\n%s%s%s%s%s%s",
                              status_buffer,
                  config->server_id,
                  currenttime_buffer,
                  contenttype_buffer,
                  "Access-Control-Allow-Origin: http://foo.example\r\n",
                  (status == 401 ? "WWW-Authenticate: Basic realm=\"Icecast2 Server\"\r\n" : ""),
                              (cache     ? "" : "Cache-Control: no-cache\r\n"
                                                "Expires: Mon, 26 Jul 1997 05:00:00 GMT\r\n"
                                                "Pragma: no-cache\r\n"),
                              (datablock ? "\r\n" : ""),
                              (datablock ? datablock : ""));

您可以通过添加以下内容将 Access-Control-Allow-Origin 标头添加到 Icecast 2.3.2 的客户端响应中

bytes = snprintf (ptr, remaining, "Access-Control-Allow-Origin: http://foo.example\r\n");
remaining -= bytes;
ptr += bytes;

format.c 中的 format_prepare_headers 方法,在添加服务器标头的行之后和添加缓存控制标头的行之前。

对该建议的其他改进包括使标头名称和值 Icecast 配置变量(将它们添加到 cfgfile.h 中的 ice_config_tag 结构并在调用 config_release_config(); 之前访问它们)或添加处理以支持泛型(例如,没有 ICY)来自源的标头,因为同一函数中的当前逻辑将 icy 添加到来自源的所有标头。

例如,如果您将自定义标头的变量添加到 cfgfile.h,char *custom_header; 添加到结构定义中,然后修改cfgfile.c 中的_parse_rootconfig_clear_set_defaults 函数,您将能够在 Icecast 配置文件中设置自定义标头,就像任何其他配置变量一样。

【讨论】:

  • 如果我在 cfgfile.h 中添加标头,我可以在哪里配置标头?我没有用 C 开发的经验,所以这对我来说有点新鲜。在当前(2.4.0)版本中也删除了服务器和缓存控制标题行
猜你喜欢
  • 2020-10-31
  • 2013-10-11
  • 1970-01-01
  • 2017-12-27
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
相关资源
最近更新 更多