如何通过HTTPS加载Web Worker脚本?

时间:2015-03-04 01:21:49

标签: javascript multithreading web-worker

我正在尝试使用Web Worker将一些CPU密集型计算卸载到一个单独的线程中。对于一个小环境,我正在从getUserMedia获取音频流并将其保存到文件中,以便在完成后上传到我的服务。我能够从用户检索流并通过WebAudio API和HTML5播放器播放,但现在我需要采取下一步将其保存到文件中。

问题

我的主要服务是通过HTTPS连接运行,因为它仅限于已登录的用户。我有一个工作脚本,可以完成我需要的工作,我试图通过相对路径将脚本加载到我的工作人员中。我收到以下错误

Mixed Content: The page at 'https://someurl.com:1081/some/path' was loaded over HTTPS, 
but requested an insecure Worker script 
'http://someurl.com/some/path/lib/assets/javascripts/worker.js'. 
This request has been blocked; the content must be served over HTTPS.

我认为这是因为我在代码中使用了相对路径,如此:

worker = new Worker('lib/assets/javascripts/worker.js');

我想排除这一点,所以我做了以下改动:

worker = new Worker('https://someurl.com:1081/some/path/lib/assets/javascripts/worker.js');

这并没有解决我的错误。看来Worker正在通过HTTP加载我的脚本,无论我尝试使用哪个url位置。我找不到任何关于如何通过HTTPS使用Web Worker的参考,所以我希望有人可以提供一些见解。

可能的解决方案

我确实希望你知道有一个可能的解决方案,但对我来说似乎有点 hacky 。我可以将我的工作脚本加载为Blob并将其直接传递到Worker。如果这是唯一的解决方案,我可以使它工作。但我希望找到一种方法来通过HTTPS加载脚本。

2 个答案:

答案 0 :(得分:0)

你试过吗

//someurl.com:1081/some/path/lib/assets/javascripts/worker.js 

而不是

https://someurl.com:1081/some/path/lib/assets/javascripts/worker.js

我在这里找到的东西, Deezer content is served over HTTP

答案 1 :(得分:0)

我解决了这个问题。错误本身就是误导性的,导致我走下一个寻找解决方案的兔子洞。

这里的问题实际上源于我配置此服务的方式。启动Web worker的服务实际上是在另一个服务后面代理,所有请求都通过父服务。这适用于大多数请求,但在这种情况下导致错误。 Web工作者试图从父服务本身下载工作脚本,而不是将此端口上的请求转发到我的应用程序。这意味着错误源于脚本未找到,而不是协议不正确。

要解决这个问题,我必须使用其资产管道从Rails传入本地化的脚本位置。这允许工作人员抓住脚本并实际工作。