nbio icon indicating copy to clipboard operation
nbio copied to clipboard

WebSocket 使用 http 代理时会跳 `unexpected EOF`

Open BANKA2017 opened this issue 1 month ago • 3 comments

过程

翻源码发现下面这部分的 port := req.URL.Scheme 导致 host 没有端口号时 scheme 会被错误地拼接到本应是 port 的位置,由于我的场景只需要使用 wss,自行将 port 固定在 443 就解决问题了,但还有没有更深层的没发现的问题就暂时未知了

https://github.com/lesismal/nbio/blob/ebf799f01754b31bcb5aa7e0106f1657bcb12cdf/nbhttp/client_conn.go#L217-L223

复现

var proxy = "http://127.0.0.1:1080" // <- 这个需要连得上,随便起一个代理服务即可
var target = "wss://echo.websocket.org" //  <- 这个不太重要

var err error

func main() {
	engine := nbhttp.NewEngine(nbhttp.Config{})
	err = engine.Start()
	if err != nil {
		fmt.Printf("nbio.Start failed: %v\n", err)
		return
	}

	// proxy
	log.Println("using proxy:", proxy)
	proxyURL, err := url.Parse(proxy)
	log.Println(proxyURL, err)

	dialer := &websocket.Dialer{
		Engine:   engine,
		Upgrader: websocket.NewUpgrader(),
		Proxy:    http.ProxyURL(proxyURL), // <- 这行注释掉马上可用
	}

	_, _, err = dialer.Dial(target, nil)

	log.Println(err) // unexpected EOF

	interrupt := make(chan os.Signal, 1)
	signal.Notify(interrupt, os.Interrupt)
	<-interrupt
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
	defer cancel()
	engine.Shutdown(ctx)
}

看起来本来是要根据 scheme 来判断默认端口但只写到一半,只能请作者来看看了

BANKA2017 avatar Nov 26 '25 02:11 BANKA2017

感谢反馈!

最近几个月github的未读消息提示不太给力,漏看了消息,肉身轮训才扫到这个issue,抱歉回复晚了。

这块代码取url.Schema确实是错误的,刚提交了下,增加了对默认端口的处理: https://github.com/lesismal/nbio/commit/db87716a8e431cda9835c86ffa256e564881b04f

可以试试这个版本是否ok:

go get -u github.com/lesismal/nbio@db87716a8e431cda9835c86ffa256e564881b04f

lesismal avatar Dec 01 '25 12:12 lesismal

感谢,更新后的版本是可用的

BANKA2017 avatar Dec 01 '25 13:12 BANKA2017

感谢,更新后的版本是可用的

感谢!我先看看近期有没有其他要提交的,过阵子再发个版本。

lesismal avatar Dec 02 '25 06:12 lesismal