trojan-go icon indicating copy to clipboard operation
trojan-go copied to clipboard

[BUG] http client 发送 request 未声明不压缩,收到压缩后的 response 无法解析发生 unexpected EOF

Open CrazyBoyFeng opened this issue 4 years ago • 1 comments

简单描述这个 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 判断压缩方式,然后调用不同的压缩算法解压缩。

CrazyBoyFeng avatar Nov 27 '20 19:11 CrazyBoyFeng

我也遇到了类似的问题,请问近期有修复这个bug的计划吗?

edwardzjl avatar Sep 16 '22 06:09 edwardzjl