mirror of
https://github.com/XTLS/Xray-core.git
synced 2025-08-26 08:25:33 +00:00
Shallow copy inbound and content
This commit is contained in:
parent
ea7f8ef0e7
commit
cca0c446d0
@ -118,9 +118,7 @@ func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader *buf.Bu
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader *buf.BufferedReader) error {
|
func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader *buf.BufferedReader) error {
|
||||||
// deep-clone outbounds because it is going to be mutated concurrently
|
ctx = session.SubContextFromMuxInbound(ctx)
|
||||||
// (Target and OriginalTarget)
|
|
||||||
ctx = session.ContextCloneOutboundsAndContent(ctx)
|
|
||||||
errors.LogInfo(ctx, "received request for ", meta.Target)
|
errors.LogInfo(ctx, "received request for ", meta.Target)
|
||||||
{
|
{
|
||||||
msg := &log.AccessMessage{
|
msg := &log.AccessMessage{
|
||||||
|
@ -16,15 +16,15 @@ const (
|
|||||||
inboundSessionKey ctx.SessionKey = 1
|
inboundSessionKey ctx.SessionKey = 1
|
||||||
outboundSessionKey ctx.SessionKey = 2
|
outboundSessionKey ctx.SessionKey = 2
|
||||||
contentSessionKey ctx.SessionKey = 3
|
contentSessionKey ctx.SessionKey = 3
|
||||||
muxPreferredSessionKey ctx.SessionKey = 4
|
muxPreferredSessionKey ctx.SessionKey = 4 // unused
|
||||||
sockoptSessionKey ctx.SessionKey = 5
|
sockoptSessionKey ctx.SessionKey = 5 // used by dokodemo to only receive sockopt.Mark
|
||||||
trackedConnectionErrorKey ctx.SessionKey = 6
|
trackedConnectionErrorKey ctx.SessionKey = 6 // used by observer to get outbound error
|
||||||
dispatcherKey ctx.SessionKey = 7
|
dispatcherKey ctx.SessionKey = 7 // used by ss2022 inbounds to get dispatcher
|
||||||
timeoutOnlyKey ctx.SessionKey = 8
|
timeoutOnlyKey ctx.SessionKey = 8 // mux context's child contexts to only cancel when its own traffic times out
|
||||||
allowedNetworkKey ctx.SessionKey = 9
|
allowedNetworkKey ctx.SessionKey = 9 // muxcool server control incoming request tcp/udp
|
||||||
handlerSessionKey ctx.SessionKey = 10
|
handlerSessionKey ctx.SessionKey = 10 // unused
|
||||||
mitmAlpn11Key ctx.SessionKey = 11
|
mitmAlpn11Key ctx.SessionKey = 11 // used by TLS dialer
|
||||||
mitmServerNameKey ctx.SessionKey = 12
|
mitmServerNameKey ctx.SessionKey = 12 // used by TLS dialer
|
||||||
)
|
)
|
||||||
|
|
||||||
func ContextWithInbound(ctx context.Context, inbound *Inbound) context.Context {
|
func ContextWithInbound(ctx context.Context, inbound *Inbound) context.Context {
|
||||||
@ -42,18 +42,8 @@ func ContextWithOutbounds(ctx context.Context, outbounds []*Outbound) context.Co
|
|||||||
return context.WithValue(ctx, outboundSessionKey, outbounds)
|
return context.WithValue(ctx, outboundSessionKey, outbounds)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ContextCloneOutboundsAndContent(ctx context.Context) context.Context {
|
func SubContextFromMuxInbound(ctx context.Context) context.Context {
|
||||||
outbounds := OutboundsFromContext(ctx)
|
newOutbounds := []*Outbound{{}}
|
||||||
newOutbounds := make([]*Outbound, len(outbounds))
|
|
||||||
for i, ob := range outbounds {
|
|
||||||
if ob == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy outbound by value
|
|
||||||
v := *ob
|
|
||||||
newOutbounds[i] = &v
|
|
||||||
}
|
|
||||||
|
|
||||||
content := ContentFromContext(ctx)
|
content := ContentFromContext(ctx)
|
||||||
newContent := Content{}
|
newContent := Content{}
|
||||||
|
@ -48,9 +48,9 @@ type Inbound struct {
|
|||||||
User *protocol.MemoryUser
|
User *protocol.MemoryUser
|
||||||
// VlessRoute is the user-sent VLESS UUID's last byte.
|
// VlessRoute is the user-sent VLESS UUID's last byte.
|
||||||
VlessRoute net.Port
|
VlessRoute net.Port
|
||||||
// Conn is actually internet.Connection. May be nil.
|
// Used by splice copy. Conn is actually internet.Connection. May be nil.
|
||||||
Conn net.Conn
|
Conn net.Conn
|
||||||
// Timer of the inbound buf copier. May be nil.
|
// Used by splice copy. Timer of the inbound buf copier. May be nil.
|
||||||
Timer *signal.ActivityTimer
|
Timer *signal.ActivityTimer
|
||||||
// CanSpliceCopy is a property for this connection
|
// CanSpliceCopy is a property for this connection
|
||||||
// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
|
// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
|
||||||
@ -69,31 +69,33 @@ type Outbound struct {
|
|||||||
Tag string
|
Tag string
|
||||||
// Name of the outbound proxy that handles the connection.
|
// Name of the outbound proxy that handles the connection.
|
||||||
Name string
|
Name string
|
||||||
// Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings
|
// Unused. Conn is actually internet.Connection. May be nil. It is currently nil for outbound with proxySettings
|
||||||
Conn net.Conn
|
Conn net.Conn
|
||||||
// CanSpliceCopy is a property for this connection
|
// CanSpliceCopy is a property for this connection
|
||||||
// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
|
// 1 = can, 2 = after processing protocol info should be able to, 3 = cannot
|
||||||
CanSpliceCopy int
|
CanSpliceCopy int
|
||||||
}
|
}
|
||||||
|
|
||||||
// SniffingRequest controls the behavior of content sniffing.
|
// SniffingRequest controls the behavior of content sniffing. They are from inbound config. Read-only
|
||||||
type SniffingRequest struct {
|
type SniffingRequest struct {
|
||||||
ExcludeForDomain []string // read-only once set
|
ExcludeForDomain []string
|
||||||
OverrideDestinationForProtocol []string // read-only once set
|
OverrideDestinationForProtocol []string
|
||||||
Enabled bool
|
Enabled bool
|
||||||
MetadataOnly bool
|
MetadataOnly bool
|
||||||
RouteOnly bool
|
RouteOnly bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Content is the metadata of the connection content.
|
// Content is the metadata of the connection content. Mainly used for routing.
|
||||||
type Content struct {
|
type Content struct {
|
||||||
// Protocol of current content.
|
// Protocol of current content.
|
||||||
Protocol string
|
Protocol string
|
||||||
|
|
||||||
SniffingRequest SniffingRequest
|
SniffingRequest SniffingRequest
|
||||||
|
|
||||||
|
// HTTP traffic sniffed headers
|
||||||
Attributes map[string]string
|
Attributes map[string]string
|
||||||
|
|
||||||
|
// SkipDNSResolve is set from DNS module. the DOH remote server maybe a domain name, this prevents cycle resolving dead loop
|
||||||
SkipDNSResolve bool
|
SkipDNSResolve bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,17 +126,19 @@ func (s *Server) forwardConnection(dest net.Destination, conn net.Conn) {
|
|||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
sid := session.NewID()
|
sid := session.NewID()
|
||||||
ctx = c.ContextWithID(ctx, sid)
|
ctx = c.ContextWithID(ctx, sid)
|
||||||
|
inbound := session.Inbound{} // since promiscuousModeHandler mixed-up context, we shallow copy inbound (tag) and content (configs)
|
||||||
if s.info.inboundTag != nil {
|
if s.info.inboundTag != nil {
|
||||||
ctx = session.ContextWithInbound(ctx, s.info.inboundTag)
|
inbound = *s.info.inboundTag
|
||||||
}
|
}
|
||||||
|
inbound.Name = "wireguard"
|
||||||
|
inbound.CanSpliceCopy = 3
|
||||||
|
inbound.Source = net.DestinationFromAddr(conn.RemoteAddr())
|
||||||
|
inbound.Gateway = net.DestinationFromAddr(conn.LocalAddr())
|
||||||
|
ctx = session.ContextWithInbound(ctx, &inbound)
|
||||||
if s.info.contentTag != nil {
|
if s.info.contentTag != nil {
|
||||||
ctx = session.ContextWithContent(ctx, s.info.contentTag)
|
ctx = session.ContextWithContent(ctx, s.info.contentTag)
|
||||||
}
|
}
|
||||||
inbound := session.InboundFromContext(ctx)
|
ctx = session.SubContextFromMuxInbound(ctx)
|
||||||
inbound.Name = "wireguard"
|
|
||||||
inbound.CanSpliceCopy = 3
|
|
||||||
outbounds := []*session.Outbound{{}}
|
|
||||||
ctx = session.ContextWithOutbounds(ctx, outbounds) // since promiscuousModeHandler mixed-up context, we need to define new Outbounds here
|
|
||||||
|
|
||||||
plcy := s.policyManager.ForLevel(0)
|
plcy := s.policyManager.ForLevel(0)
|
||||||
timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle)
|
timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle)
|
||||||
|
Loading…
Reference in New Issue
Block a user