ios - 在 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:// 请求被传递给处理程序。
解决方案
推荐阅读
- mysql - Laravel 复杂的雄辩关系
- c - 为什么我不能从 malloc 获得 2 GB?
- javascript - 我正在网站上设置 PayPal,并使用液体将购物车价值拉入 JS
- java - JAVA 方法返回意外值
- hyperledger-fabric - Hypereldger Fabric:没有创世块的引导排序器
- certificate - keytool 错误:java.lang.Exception:证书未导入,别名 mykey 已存在
- laravel - 不在 Laravel 7 中制作表格
- php - 应用程序崩溃并未能绑定 $PORT 60 秒
- sql-server - 什么是 SQL Server 凭据的 Oracle 等效项
- javascript - 数组的 JavaScript 副本