diff --git a/proxy/vmess/encoding/encoding_test.go b/proxy/vmess/encoding/encoding_test.go index e5452834..12b87c40 100644 --- a/proxy/vmess/encoding/encoding_test.go +++ b/proxy/vmess/encoding/encoding_test.go @@ -30,7 +30,7 @@ func TestRequestSerialization(t *testing.T) { Version: 1, User: user, Command: protocol.RequestCommandTCP, - Option: protocol.RequestOption(0), + Option: protocol.RequestOptionConnectionReuse, Address: v2net.DomainAddress("www.v2ray.com"), Port: v2net.Port(443), Security: protocol.Security(protocol.SecurityType_AES128_GCM), diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index 1c212ab2..1b8fc104 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -153,6 +153,8 @@ func (v *VMessInboundHandler) HandleConnection(connection internet.Connection) { request, err := session.DecodeRequestHeader(reader) v.RUnlock() + connection.SetReusable(request.Option.Has(protocol.RequestOptionConnectionReuse)) + if err != nil { if errors.Cause(err) != io.EOF { log.Access(connection.RemoteAddr(), "", log.AccessRejected, err) diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 9bca067e..c3870872 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -138,9 +138,7 @@ func (v *VMessOutboundHandler) handleResponse(session *encoding.ClientSession, c } go v.handleCommand(dest, header.Command) - if !header.Option.Has(protocol.ResponseOptionConnectionReuse) { - conn.SetReusable(false) - } + conn.SetReusable(header.Option.Has(protocol.ResponseOptionConnectionReuse)) reader.SetCached(false) bodyReader := session.DecodeResponseBody(request, reader) diff --git a/transport/internet/tcp/connection.go b/transport/internet/tcp/connection.go index ab8a887f..0c9b6009 100644 --- a/transport/internet/tcp/connection.go +++ b/transport/internet/tcp/connection.go @@ -93,14 +93,11 @@ func (v *Connection) SetWriteDeadline(t time.Time) error { } func (v *Connection) SetReusable(reusable bool) { - if !v.config.ConnectionReuse.IsEnabled() { - return - } v.reusable = reusable } func (v *Connection) Reusable() bool { - return v.reusable + return v.config.ConnectionReuse.IsEnabled() && v.reusable } func (v *Connection) SysFd() (int, error) {