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)