trojan-go
trojan-go copied to clipboard
[BUG] http client 发送 request 未声明不压缩,收到压缩后的 response 无法解析发生 unexpected EOF
简单描述这个 Bug
作为http代理客户端使用时发生:
github.com/p4gefau1t/trojan-go/tunnel/http.(*Server).acceptLoop.func1:server.go:147 http failed to read http response | unexpected EOF
https://github.com/p4gefau1t/trojan-go/blob/d051cf4c8852d708769ca1c4e514306a88da830b/tunnel/http/server.go#L147
如何复现这个 Bug
作为 http client 为浏览器进行代理时发生该错误,并发生内存溢出。
服务器和客户端环境信息
服务器:centos7.5+trojan-go-0.8.2
客户端:win10+edge+trojan-go-0.8.2
服务端和客户端日志
客户端日志
[INFO] 2020/11/28 03:17:38 router client created
[ERROR] 2020/11/28 03:18:15 github.com/p4gefau1t/trojan-go/tunnel/adapter.(*Server).acceptConnLoop:server.go:45 failed to detect proxy protocol type | EOF
[ERROR] 2020/11/28 03:18:15 github.com/p4gefau1t/trojan-go/tunnel/socks.(*Server).acceptLoop.func1:server.go:208 socks failed to handshake with client | failed to read command
[ERROR] 2020/11/28 03:19:55 github.com/p4gefau1t/trojan-go/tunnel/http.(*Server).acceptLoop.func1:server.go:147 http failed to read http response | unexpected EOF
后面一直重复147直至内存溢出。
服务器日志
[INFO] 2020/11/28 03:18:15 tcp connection from ***
[INFO] 2020/11/28 03:18:15 tls connection from ***
[ERROR] 2020/11/28 03:18:15 github.com/p4gefau1t/trojan-go/tunnel/mux.(*Server).acceptConnWorker.func1.1:server.go:46 EOF
[INFO] 2020/11/28 03:18:15 user *** from *** tunneling to MUX_CONN:0 closed sent: 42.43 KiB recv: 39.79 KiB
[INFO] 2020/11/28 03:18:16 user *** from *** tunneling to MUX_CONN:0 closed sent: 42.43 KiB recv: 39.79 KiB
[ERROR] 2020/11/28 03:18:16 github.com/p4gefau1t/trojan-go/proxy.(*Proxy).relayConnLoop.func1.1:proxy.go:81 io: read/write on closed pipe
服务端和客户端配置文件
客户端配置
{
"run_type": "client",
"local_addr": "127.0.0.1",
"local_port": 1080,
"remote_addr": "IP",
"remote_port": 443,
"password": [
"***"
],
"websocket": {
"enabled": true,
"host": "域名",
"path": "/位置"
},
"ssl":{
"sni":"域名"
},
"mux": {
"enabled": true
},
"router": {
"enabled": true,
"bypass": [
"geoip:cn",
"geoip:private",
"geosite:cn",
"geosite:geolocation-cn"
],
"block": [
"geosite:category-ads"
],
"proxy": [
"geosite:geolocation-!cn"
],
"default_policy": "proxy",
"geoip": "geoip.dat",
"geosite": "geosite.dat"
}
}
服务器配置
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": [
"***"
],
"mux": {
"enabled": true
},
"ssl": {
"cert": "***.cer",
"key": "***.key",
"verify_hostname": false
},
"websocket": {
"enabled": true,
"path": "/位置"
}
}
服务端和客户端版本信息
客户端
Trojan-Go v0.8.2
Go Version: go1.15.1
OS/Arch: windows/amd64
Git Commit: d051cf4c8852d708769ca1c4e514306a88da830b
Developed by PageFault (p4gefau1t)
Licensed under GNU General Public License version 3
GitHub Repository: https://github.com/p4gefau1t/trojan-go
Trojan-Go Documents: https://p4gefau1t.github.io/trojan-go/
服务端
Trojan-Go v0.8.2
Go Version: go1.15.1
OS/Arch: linux/amd64
Git Commit: d051cf4c8852d708769ca1c4e514306a88da830b
Developed by PageFault (p4gefau1t)
Licensed under GNU General Public License version 3
GitHub Repository: https://github.com/p4gefau1t/trojan-go
Trojan-Go Documents: https://p4gefau1t.github.io/trojan-go/
其他信息
搜索 unexpected EOF
可知这是使用 go 的 http client
未对 content-encoding
进行判断和解压缩所导致的。👉 https://stackoverflow.com/questions/21147562/unexpected-eof-using-go-http-client
解决办法有两种:
- 将压缩关闭,关闭的方法如同上面的链接所述,发送
request
时标记为不接受压缩req.Header.Add("Accept-Encoding", "identity")
即可。 - 根据 response 的
content-encoding
判断压缩方式,然后调用不同的压缩算法解压缩。
我也遇到了类似的问题,请问近期有修复这个bug的计划吗?