Ws在进行协议升级的时候,获取不到完整的头部信息
问题描述
我本地启动了tcp服务,使用浏览器发起websocket连接的时候,浏览器请求的头部信息是完整的,但是在我服务器里面拿到的头部缺了一些,请求头的数据是从:gopath路径\src\crypto\tls\conn.go
文件中的Conn
结构体c.rawInput.Bytes()
读取出来的,而且只有这个ws站点请求有问题,会是什么原因呢?
- 浏览器请求头
Request URL:ws://81.68.666.777:11447/messages Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cache-Control: no-cache Connection: Upgrade Host: 81.68.666.777:11447 Origin: http://81.68.666.777:11445 Pragma: no-cache Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Sec-WebSocket-Key: WigVL7z8DYQ7m84aSyrTvg== Sec-WebSocket-Protocol: v12.stomp Sec-WebSocket-Version: 13 Upgrade: websocket User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0
- 服务器接收的数据
GET /messages HTTP/1.1 Host: 81.68.666.777:11447 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0 Upgrade: websocket Origin: http://81.68.666.777:11445 Sec-WebSocket-Version: 13 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: gpcaptchaid=0a011e13-b36f-49ef-2a35-19ead1dbed2e; 8d15e6100f54bd937e6edd24b5ca0fb7=904882929734c7885d881e
在Upgrade的时候报错:websocket: not a websocket handshake: ‘Sec-WebSocket-Key’ header is missing or blank
看下我的客户端请求,https://learnku.com/articles/70213,之前我也有这个错误
结贴:问题的原因是go标准库读取不完整导致的,如果我自己手动读取,是可以读完整的。
websocket: not a websocket handshake: ‘Sec-WebSocket-Key’ header is missing or blank 这里已经提示没有这个请求头,想要定位只需要wireshark 抓包一下就知道了。 要不用workerman 监听websocket 端口,打印下http 协议包就知道整个是什么样子。