From 31c1a0027bfd816c7e7996101538f7c91e8e2d0b Mon Sep 17 00:00:00 2001 From: lrh2000 Date: Tue, 4 Jan 2022 09:38:35 +0800 Subject: [PATCH] proxy: Unify timeouts of different protocols for reading the first payload --- proxy/http/client.go | 6 +++--- proxy/proxy.go | 4 ++++ proxy/shadowsocks/client.go | 4 ++-- proxy/trojan/client.go | 4 ++-- proxy/vless/outbound/outbound.go | 4 ++-- proxy/vmess/outbound/outbound.go | 4 ++-- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/proxy/http/client.go b/proxy/http/client.go index 0e2175a629b..0178940c114 100644 --- a/proxy/http/client.go +++ b/proxy/http/client.go @@ -8,7 +8,6 @@ import ( "net/http" "net/url" "sync" - "time" "golang.org/x/net/http2" @@ -23,6 +22,7 @@ import ( "github.com/v2fly/v2ray-core/v5/common/signal" "github.com/v2fly/v2ray-core/v5/common/task" "github.com/v2fly/v2ray-core/v5/features/policy" + "github.com/v2fly/v2ray-core/v5/proxy" "github.com/v2fly/v2ray-core/v5/transport" "github.com/v2fly/v2ray-core/v5/transport/internet" "github.com/v2fly/v2ray-core/v5/transport/internet/tls" @@ -83,11 +83,11 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter var firstPayload []byte if reader, ok := link.Reader.(buf.TimeoutReader); ok { - // 0-RTT optimization for HTTP/2: If the payload comes within 50 ms, it can be + // 0-RTT optimization for HTTP/2: If the payload comes very soon, it can be // transmitted together. Note we should not get stuck here, as the payload may // not exist (considering to access MySQL database via a HTTP proxy, where the // server sends hello to the client first). - if mbuf, _ := reader.ReadMultiBufferTimeout(50 * time.Millisecond); mbuf != nil { + if mbuf, _ := reader.ReadMultiBufferTimeout(proxy.FirstPayloadTimeout); mbuf != nil { mlen := mbuf.Len() firstPayload = bytespool.Alloc(mlen) mbuf, _ = buf.SplitBytes(mbuf, firstPayload) diff --git a/proxy/proxy.go b/proxy/proxy.go index 45a89dad591..0553b8fa80a 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -7,6 +7,7 @@ package proxy import ( "context" + "time" "github.com/v2fly/v2ray-core/v5/common/net" "github.com/v2fly/v2ray-core/v5/common/protocol" @@ -15,6 +16,9 @@ import ( "github.com/v2fly/v2ray-core/v5/transport/internet" ) +// A timeout for reading the first payload from the client, used in 0-RTT optimizations. +const FirstPayloadTimeout = 100 * time.Millisecond + // An Inbound processes inbound connections. type Inbound interface { // Network returns a list of networks that this inbound supports. Connections with not-supported networks will not be passed into Process(). diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index e0d1836828b..64041ed67cc 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -2,7 +2,6 @@ package shadowsocks import ( "context" - "time" core "github.com/v2fly/v2ray-core/v5" "github.com/v2fly/v2ray-core/v5/common" @@ -14,6 +13,7 @@ import ( "github.com/v2fly/v2ray-core/v5/common/signal" "github.com/v2fly/v2ray-core/v5/common/task" "github.com/v2fly/v2ray-core/v5/features/policy" + "github.com/v2fly/v2ray-core/v5/proxy" "github.com/v2fly/v2ray-core/v5/transport" "github.com/v2fly/v2ray-core/v5/transport/internet" ) @@ -108,7 +108,7 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter return newError("failed to write request").Base(err) } - if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { + if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, proxy.FirstPayloadTimeout); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return newError("failed to write A request payload").Base(err).AtWarning() } diff --git a/proxy/trojan/client.go b/proxy/trojan/client.go index 293e2079706..b6630447ffb 100644 --- a/proxy/trojan/client.go +++ b/proxy/trojan/client.go @@ -2,7 +2,6 @@ package trojan import ( "context" - "time" core "github.com/v2fly/v2ray-core/v5" "github.com/v2fly/v2ray-core/v5/common" @@ -14,6 +13,7 @@ import ( "github.com/v2fly/v2ray-core/v5/common/signal" "github.com/v2fly/v2ray-core/v5/common/task" "github.com/v2fly/v2ray-core/v5/features/policy" + "github.com/v2fly/v2ray-core/v5/proxy" "github.com/v2fly/v2ray-core/v5/transport" "github.com/v2fly/v2ray-core/v5/transport/internet" ) @@ -99,7 +99,7 @@ func (c *Client) Process(ctx context.Context, link *transport.Link, dialer inter } // write some request payload to buffer - if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { + if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, proxy.FirstPayloadTimeout); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return newError("failed to write A request payload").Base(err).AtWarning() } diff --git a/proxy/vless/outbound/outbound.go b/proxy/vless/outbound/outbound.go index 94c57bebf29..4d09a2e7fd4 100644 --- a/proxy/vless/outbound/outbound.go +++ b/proxy/vless/outbound/outbound.go @@ -4,7 +4,6 @@ package outbound import ( "context" - "time" core "github.com/v2fly/v2ray-core/v5" "github.com/v2fly/v2ray-core/v5/common" @@ -17,6 +16,7 @@ import ( "github.com/v2fly/v2ray-core/v5/common/signal" "github.com/v2fly/v2ray-core/v5/common/task" "github.com/v2fly/v2ray-core/v5/features/policy" + "github.com/v2fly/v2ray-core/v5/proxy" "github.com/v2fly/v2ray-core/v5/proxy/vless" "github.com/v2fly/v2ray-core/v5/proxy/vless/encoding" "github.com/v2fly/v2ray-core/v5/transport" @@ -139,7 +139,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte // default: serverWriter := bufferWriter serverWriter := encoding.EncodeBodyAddons(bufferWriter, request, requestAddons) - if err := buf.CopyOnceTimeout(clientReader, serverWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { + if err := buf.CopyOnceTimeout(clientReader, serverWriter, proxy.FirstPayloadTimeout); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return err // ... } diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index 2c2bfe37427..1b7fab1acac 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -7,7 +7,6 @@ import ( "crypto/hmac" "crypto/sha256" "hash/crc64" - "time" core "github.com/v2fly/v2ray-core/v5" "github.com/v2fly/v2ray-core/v5/common" @@ -21,6 +20,7 @@ import ( "github.com/v2fly/v2ray-core/v5/common/signal" "github.com/v2fly/v2ray-core/v5/common/task" "github.com/v2fly/v2ray-core/v5/features/policy" + "github.com/v2fly/v2ray-core/v5/proxy" "github.com/v2fly/v2ray-core/v5/proxy/vmess" "github.com/v2fly/v2ray-core/v5/proxy/vmess/encoding" "github.com/v2fly/v2ray-core/v5/transport" @@ -150,7 +150,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte } bodyWriter := session.EncodeRequestBody(request, writer) - if err := buf.CopyOnceTimeout(input, bodyWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { + if err := buf.CopyOnceTimeout(input, bodyWriter, proxy.FirstPayloadTimeout); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return newError("failed to write first payload").Base(err) }