From 8351ccb625493809de120009b1e25bae41dc9808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Wed, 10 Sep 2025 05:12:40 +0000 Subject: [PATCH] Add NewClient() --- common/protocol/http/client.go | 34 ++++++++++++++++++++++++++++++++++ proxy/vmess/vtime/vtime.go | 18 +++--------------- 2 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 common/protocol/http/client.go diff --git a/common/protocol/http/client.go b/common/protocol/http/client.go new file mode 100644 index 00000000..0d4208ba --- /dev/null +++ b/common/protocol/http/client.go @@ -0,0 +1,34 @@ +package http + +import ( + "context" + gohttp "net/http" + + "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/transport/internet" +) + +// NewClient creates an HTTP client with with internal dialer and using the given sockopt. +// sockopt can only have one or empty. +func NewClient(sockopt ...*internet.SocketConfig) *gohttp.Client { + var Sockopt *internet.SocketConfig + switch len(sockopt) { + case 0: + case 1: + Sockopt = sockopt[0] + default: + panic("sockopt can only be nil or have one") + } + httpClient := &gohttp.Client{ + Transport: &gohttp.Transport{ + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + dest, err := net.ParseDestination(network + ":" + addr) + if err != nil { + return nil, err + } + return internet.DialSystem(ctx, dest, Sockopt) + }, + }, + } + return httpClient +} diff --git a/proxy/vmess/vtime/vtime.go b/proxy/vmess/vtime/vtime.go index 6bc0094a..a2418bac 100644 --- a/proxy/vmess/vtime/vtime.go +++ b/proxy/vmess/vtime/vtime.go @@ -2,16 +2,14 @@ package vtime import ( "context" - "net/http" + "runtime" "sync" "sync/atomic" "time" - "runtime" "github.com/xtls/xray-core/common/errors" - "github.com/xtls/xray-core/common/net" "github.com/xtls/xray-core/common/platform" - "github.com/xtls/xray-core/transport/internet" + "github.com/xtls/xray-core/common/protocol/http" ) var timeOffset atomic.Pointer[time.Duration] @@ -32,17 +30,7 @@ func updateTimeMonitor(ctx context.Context, domain string) { } func updateTime(domain string) error { - httpClient := &http.Client{ - Transport: &http.Transport{ - DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { - dest, err := net.ParseDestination(network + ":" + addr) - if err != nil { - return nil, err - } - return internet.DialSystem(ctx, dest, nil) - }, - }, - } + httpClient := http.NewClient() resp, err := httpClient.Get(domain) if err != nil { return errors.New("Failed to access monitor domain").Base(err)