我们如何仅在某些路径下使用electron.protocol.interceptFileProtocol,而其他请求则保持不变?

时间:2019-05-01 22:13:25

标签: javascript electron electron-protocol

我想拦截某些HTTP请求并将其替换为文件。所以我想我可以像这样使用electron.protocol.interceptFileProtocol

protocol.interceptFileProtocol('http', (request, callback) => {
  // intercept only requests to "http://example.com"
  if (request.url.startsWith("http://example.com")) {
    callback("/path/to/file")
  }

  // otherwise, let the HTTP request behave like normal.
  // But how?
})

我们如何允许http以外的其他http://example.com个请求继续正常工作?

2 个答案:

答案 0 :(得分:1)

不确定是否有办法完全做到这一点?但是我做了类似的事情,就是使用session.defaultSession.webRequest.onBeforeRequest 参见:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest

类似

session.defaultSession.webRequest.onBeforeRequest({urls: ['http://example.com']}, function(details, callback) {
  callback({
    redirectURL: 'file://' + this.getUrl(details.url)
  });
});

如果您不仅需要重定向,还可以重定向到您自己的自定义协议(例如,像mycustomprotocol://...这样的URL)。您可以使用protocol.registerStringProtocol等实现自己的协议处理程序。

到目前为止,我在电子中分别使用onBeforeRequest和registerStringProtocol都没有问题,但从来没有一起使用过-尽管我是乔治,但应该一起工作。

答案 1 :(得分:1)

使用protocol.interceptXXXXProtocol(scheme, handler)时,我们正在拦截方案协议,并将处理程序用作协议的新处理程序,如in the doc here所述,该处理程序发送新的XXXX请求作为响应。

但是,这样做完全破坏了此特定协议的初始处理程序,这是我们在处理回调执行后所需的。因此,我们只需要将其恢复到其初始状态,即可继续正常工作:)

让我们使用:protocol.uninterceptProptocol(scheme)

protocol.interceptFileProtocol('http', (request, callback) => {
  // intercept only requests to "http://example.com"
  if (request.url.startsWith("http://example.com")) {
    callback("/path/to/file")
  }

  // otherwise, let the HTTP request behave like normal.
  protocol.uninterceptProtocol('http');
})