具有不同截止日期的 https 和 websocket 处理程序

我有一个接受端口连接的玩具代理服务器。我为读/写操作设置了一些截止日期,以避免有太多来自无法正确关闭的不良客户端的空闲连接。

问题是我想为指向 websockets 的连接设置一个更高的截止日期(wss特别是)。对于普通的 http 请求,我可以看到101 Switching Protocols响应,但 https/wss 比较棘手,因为我主要执行io.CopyBuffer从 src 连接到 dst 连接的操作,并且在初始代理连接中我没有看到任何“websocket 相关”以区分 https 和 wss并应用适当的截止日期。

我已经将调试屏幕包含在对wss://演示服务器的此类请求中。

http://img.mukewang.com/63b3c26600011a4b09881292.jpg

有任何想法吗?



POPMUISE
浏览 103回答 2
2回答

凤凰求蛊

仅通过查看加密数据无法可靠地区分“正常”HTTP 流量和 Websockets。人们可以通过查看流量模式来尝试做一些启发式方法,即在哪个方向上在哪个时间传输了多少数据以及数据之间有多少空闲时间。这种启发式可以基于以下假设:HTTP 是一种请求 + 响应协议,通常小请求紧随其后是较大的响应,而 Websockets 可以显示任意流量模式。但任意流量模式也意味着 Websockets 也可以以请求 + 响应的方式使用。(虽然包括请求+响应)。此外,在某些用例中,HTTP 的使用模式主要由大请求和小响应组成。因此,根据应用程序的类型,这种启发式方法可能会成功,也可能会失败。

慕慕森

定义全局服务器超时始终是一个好习惯,以确保资源不会永远被锁定。该超时不应小于所有处理程序中最长的超时。DefaultServer = &http.Server{    Handler:        http.TimeoutHandler(handler, wssTimeout, timeoutResponse),...}在处理 http 和 wss 请求的 handler 中,我们需要动态设置超时时间。func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request) {    // Request Context is going to be cancelled if client's connection closes, the request is canceled (with HTTP/2), Server we created above time outed.    // all code down the stack should respect that ctx.     ctx := r.Context()            timeoit := httpTimeout    if itIsWSS(r) {       timeout = wssTimeout    }        ctx, cancel = cWithTimeout(ctx, timeout)    defer cancel()        // all code below to use ctx instead of context.Backgound()/TODO()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go