mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-02-20 23:47:21 -05:00
🐛 http dialer add socket config; sockopt.mark use uint32 (#1264)
(cherry picked from commit 4d155bc2bf9dc5bdc3d7433aa67fbc2f5f93677d)
This commit is contained in:
parent
38f10d029e
commit
27614e56fc
@ -75,7 +75,7 @@ type Content struct {
|
|||||||
// Sockopt is the settings for socket connection.
|
// Sockopt is the settings for socket connection.
|
||||||
type Sockopt struct {
|
type Sockopt struct {
|
||||||
// Mark of the socket connection.
|
// Mark of the socket connection.
|
||||||
Mark int32
|
Mark uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAttribute attachs additional string attributes to content.
|
// SetAttribute attachs additional string attributes to content.
|
||||||
|
@ -56,7 +56,7 @@ message ProxyConfig {
|
|||||||
// SocketConfig is options to be applied on network sockets.
|
// SocketConfig is options to be applied on network sockets.
|
||||||
message SocketConfig {
|
message SocketConfig {
|
||||||
// Mark of the connection. If non-zero, the value will be set to SO_MARK.
|
// Mark of the connection. If non-zero, the value will be set to SO_MARK.
|
||||||
int32 mark = 1;
|
uint32 mark = 1;
|
||||||
|
|
||||||
enum TCPFastOpenState {
|
enum TCPFastOpenState {
|
||||||
// AsIs is to leave the current TFO state as is, unmodified.
|
// AsIs is to leave the current TFO state as is, unmodified.
|
||||||
|
@ -24,16 +24,24 @@ var (
|
|||||||
globalDialerAccess sync.Mutex
|
globalDialerAccess sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
func getHTTPClient(ctx context.Context, dest net.Destination, tlsSettings *tls.Config) *http.Client {
|
type dialerCanceller func()
|
||||||
|
|
||||||
|
func getHTTPClient(ctx context.Context, dest net.Destination, tlsSettings *tls.Config, streamSettings *internet.MemoryStreamConfig) (*http.Client, dialerCanceller) {
|
||||||
globalDialerAccess.Lock()
|
globalDialerAccess.Lock()
|
||||||
defer globalDialerAccess.Unlock()
|
defer globalDialerAccess.Unlock()
|
||||||
|
|
||||||
|
canceller := func() {
|
||||||
|
globalDialerAccess.Lock()
|
||||||
|
defer globalDialerAccess.Unlock()
|
||||||
|
delete(globalDialerMap, dest)
|
||||||
|
}
|
||||||
|
|
||||||
if globalDialerMap == nil {
|
if globalDialerMap == nil {
|
||||||
globalDialerMap = make(map[net.Destination]*http.Client)
|
globalDialerMap = make(map[net.Destination]*http.Client)
|
||||||
}
|
}
|
||||||
|
|
||||||
if client, found := globalDialerMap[dest]; found {
|
if client, found := globalDialerMap[dest]; found {
|
||||||
return client
|
return client, canceller
|
||||||
}
|
}
|
||||||
|
|
||||||
transport := &http2.Transport{
|
transport := &http2.Transport{
|
||||||
@ -52,7 +60,7 @@ func getHTTPClient(ctx context.Context, dest net.Destination, tlsSettings *tls.C
|
|||||||
address := net.ParseAddress(rawHost)
|
address := net.ParseAddress(rawHost)
|
||||||
|
|
||||||
detachedContext := core.ToBackgroundDetachedContext(ctx)
|
detachedContext := core.ToBackgroundDetachedContext(ctx)
|
||||||
pconn, err := internet.DialSystem(detachedContext, net.TCPDestination(address, port), nil)
|
pconn, err := internet.DialSystem(detachedContext, net.TCPDestination(address, port), streamSettings.SocketSettings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -80,7 +88,7 @@ func getHTTPClient(ctx context.Context, dest net.Destination, tlsSettings *tls.C
|
|||||||
}
|
}
|
||||||
|
|
||||||
globalDialerMap[dest] = client
|
globalDialerMap[dest] = client
|
||||||
return client
|
return client, canceller
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial dials a new TCP connection to the given destination.
|
// Dial dials a new TCP connection to the given destination.
|
||||||
@ -90,7 +98,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
if tlsConfig == nil {
|
if tlsConfig == nil {
|
||||||
return nil, newError("TLS must be enabled for http transport.").AtWarning()
|
return nil, newError("TLS must be enabled for http transport.").AtWarning()
|
||||||
}
|
}
|
||||||
client := getHTTPClient(ctx, dest, tlsConfig)
|
client, canceller := getHTTPClient(ctx, dest, tlsConfig, streamSettings)
|
||||||
|
|
||||||
opts := pipe.OptionsFromContext(ctx)
|
opts := pipe.OptionsFromContext(ctx)
|
||||||
preader, pwriter := pipe.New(opts...)
|
preader, pwriter := pipe.New(opts...)
|
||||||
@ -128,6 +136,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
|||||||
|
|
||||||
response, err := client.Do(request) // nolint: bodyclose
|
response, err := client.Do(request) // nolint: bodyclose
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
canceller()
|
||||||
return nil, newError("failed to dial to ", dest).Base(err).AtWarning()
|
return nil, newError("failed to dial to ", dest).Base(err).AtWarning()
|
||||||
}
|
}
|
||||||
if response.StatusCode != 200 {
|
if response.StatusCode != 200 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user