首页 > 解决方案 > 在 Ios/Swift 5 中拦截 websocket HTTP 升级请求 - URLProtocol

问题描述

我正在构建一个库,用于将白名单中的所有请求重定向到不同的主机。有几个关于如何做到这一点的例子,所以这方面的大部分工作已经完成。如果原始请求在白名单中,该库会对原始请求进行一些修改,例如加密、修改请求正文等。我现在也在尝试将 websocket 重定向集成到库中,因为需要修改和重定向对 websocket 的请求(如果在白名单中)。这个想法是透明地处理所有底层任务,因此使用该库的开发人员不必处理任何重定向。

我正在使用 URLprotocol,它对于正常的 HTTP 请求非常有效,每个请求都传递给我的 URL 协议“canInit”函数,在该函数中确定它是否在白名单中,然后处理或不处理。但是,“canInit”从未看到过 websocket 升级请求,因此我无法修改该请求。

是否可以拦截 URLSessionWebSocketTask HTTP 升级请求?使用 URLProtocol 还是其他方法?

感谢任何人的回应

编辑:代码是专有的,所以添加一些 sudo 代码来显示实现。

class MyURLProtocol: NSURLProtocol {
  override class func canInit(request: NSURLRequest) -> Bool {
    println("URL = \(request.URL.absoluteString)")
    if (url is in whitelist) {
      return true
    }
    return false
  } 
}

如图所示,我打印了所有传递给处理程序的请求,但没有 ws:// 或 wss:// 请求被传递给处理程序。

标签: ioswebsocketswift5urlsessionurlsessionwebsockettask

解决方案


推荐阅读