WebSocket + Network Service + WebRequest API
本文档介绍了在启用网络服务的情况下如何在WebSocket上支持WebRequest API。
当前状态
WebSocket + WebRequest API(无网络服务)
禁用网络服务后,我们将(child_id,render_frame_id)附加到content :: WebSocketManager中的net :: URLRequest。 附件中的信息在extensions :: WebRequest :: WebRequest(net :: URLRequest *)中读取,并且WebRequest API模块与常规资源加载情况一样,处理net :: NetworkDelegate的事件。
请注意,不支持重定向。
WebRequest API + Network Service (for http[s]😕/)
ChromeContentBrowserClient继承content :: ContentBrowserClient实现WillCreateURLLoaderFactory。 必要时,该函数返回扩展名::: WebRequestProxyingURLLoaderFactory,它代理network :: mojom :: URLLoader和network :: mojom :: URLLoaderClient并处理来自它们的事件。
WebSocket +Network Service (不支持WebRequest API)
来自框架的Websocket请求(即我们省略了来自Web工作者的请求)在content :: RenderFrameHostImpl :: CreateWebSocket中处理。 如果启用了网络服务,我们将调用network :: mojom :: NextworkService :: CreateWebSocket。
之后,渲染器将直接与网络服务对话。
拟议设计
由于我们希望避免尽可能多地将消息专用于扩展,因此我们将放弃一些功能。
- 在OnBeforeSendHeaders上,大多数现在可见的标头将不可见:
- Sec-WebSocket-key
- Sec-WebSocket-Extensions
- 升级
- 连接
- cookies
- 安全WebSocket版本
- Sec-WebSocket-Protocol(可以放宽)
- 与OnSendHeaders相同。
- 在OnBeforeSendHeaders上,一些标头修改将被忽略。 请参阅https://chromiumreview.googlesource.com/c/chromium/src/+/1059092。
- 在OnHeadersReceived上,扩展将无法修改响应头。
http://crbug.com/841827阻止了如何实现OnAuthRequired。
替代设计
基本策略
与WebRequest API对HTTP [S]连接的支持不同,具有网络服务的WebSocket将与不具有网络服务的WebSocket一样支持WebRequest API。
主要原因是与常规HTTP [S]连接相比,我们在net /中执行的操作更多,而在眨眼中执行的操作则更少。 例如,响应标头的处理是在net / websockets中完成的,因此在不提供拦截接口的情况下,扩展onHeadersReceived所能做的只是取消请求或修改websocket协议/扩展。
另一个原因是与WebS