javascript拦截来自Web Worker的HTTP提取+文件URL

时间:2019-02-27 10:07:35

标签: javascript web-worker

我想拦截应用程序中所有部分和库的抓取,同时我也不想破坏通过文件URL使用该应用程序的可能性-这对电子和移动设备非常有用(通过WebView)。现在,我已经找到了两种可能的方法:

  1. 类似here

    const realFetch = window.fetch;
    window.fetch = function() {
    // do something
    return realFetch.apply(this, arguments)
    }
    
  2. 类似here,且已注册服务工作者:

main.js:

if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
  navigator.serviceWorker.register('sw.js').then(function(registration) {
    console.log('Service worker registered with scope: ', registration.scope);
  }, function(err) {
  console.log('ServiceWorker registration failed: ', err);
});
});
}

sw.js:

self.addEventListener('fetch', function(event) {
  event.respondWith(
  // intercept requests by handling event.request here
  );
});

使用第一种方法,我无法拦截来自网络工作者的获取请求。第二种方法不适用于文件URL,我希望我的应用程序通过文件URL工作,因为它允许我通过桌面电子版或Android的WebView使用该应用程序。还有其他方法可以拦截获取请求吗?

P.S。我无法修改尝试拦截其请求的工作程序。

更新: 在@Ciro Corvino的回答的基础上,我尝试了第三种方法:在其他任何方法之前先启动自己的工作程序,然后尝试从那里重新定义访存。不幸的是,这对我没用,这是代码:

function redefineFetch() {
console.log('inside worker');
if (self.fetch == null) {
    console.log('null!');
} else {
    console.log(self.fetch.toString());
}
const originalFetch: WindowOrWorkerGlobalScope['fetch'] = self.fetch;
self.fetch = (input: RequestInfo, init: RequestInit) => {
    console.log('overridden');
    return originalFetch(input, init);
}
}
const blob = new Blob(['(' +
redefineFetch.toString() + ')()'], {type: 'text/javascript'});

const blobUrl = window.URL.createObjectURL(blob);
const w = new Worker(blobUrl);

我确定这段代码会在其他工作线程之前启动(我已经添加了超时),但这不会为其他工作线程重新定义获取。有人可以解释原因或解决方案吗?

更新2: 显然,每个工作人员都有自己的私有WorkerGlobalScope,否则使用消息进行工作人员之间的通信是没有意义的。如果可能的话,可能是针对我的问题的另一种解决方法是重写Worker构造函数。将检查它。

1 个答案:

答案 0 :(得分:2)

只需尝试将当前WorkerGlobalScope的访存方法覆盖到主要javascript上下文(window)中,并覆盖在调用此函数的专用辅助上下文中运行的每个js文件:

  

请注意,self属性返回每个上下文的专用范围

 //works in each worker context you call it and enable fetch interception
 function EnableFetchWithArguments() {
   const originalCtxFetch = self.fetch;
   self.fetch = function() {
     // Get the parameter in arguments
     // Intercept the parameter here 
     return originalCtxFetch.apply(this, arguments)
   }
 }
  

请参阅参考资料和浏览器兼容性:WorkerGlobalScope