123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- package session
- import (
- "context"
- "github.com/xtls/xray-core/common/net"
- "github.com/xtls/xray-core/common/session"
- "github.com/xtls/xray-core/features/routing"
- )
- // Context is an implementation of routing.Context, which is a wrapper of context.context with session info.
- type Context struct {
- Inbound *session.Inbound
- Outbound *session.Outbound
- Content *session.Content
- }
- // GetInboundTag implements routing.Context.
- func (ctx *Context) GetInboundTag() string {
- if ctx.Inbound == nil {
- return ""
- }
- return ctx.Inbound.Tag
- }
- // GetSourceIPs implements routing.Context.
- func (ctx *Context) GetSourceIPs() []net.IP {
- if ctx.Inbound == nil || !ctx.Inbound.Source.IsValid() {
- return nil
- }
- dest := ctx.Inbound.Source
- if dest.Address.Family().IsDomain() {
- return nil
- }
- return []net.IP{dest.Address.IP()}
- }
- // GetSourcePort implements routing.Context.
- func (ctx *Context) GetSourcePort() net.Port {
- if ctx.Inbound == nil || !ctx.Inbound.Source.IsValid() {
- return 0
- }
- return ctx.Inbound.Source.Port
- }
- // GetTargetIPs implements routing.Context.
- func (ctx *Context) GetTargetIPs() []net.IP {
- if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() {
- return nil
- }
- if ctx.Outbound.Target.Address.Family().IsIP() {
- return []net.IP{ctx.Outbound.Target.Address.IP()}
- }
- return nil
- }
- // GetTargetPort implements routing.Context.
- func (ctx *Context) GetTargetPort() net.Port {
- if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() {
- return 0
- }
- return ctx.Outbound.Target.Port
- }
- // GetTargetDomain implements routing.Context.
- func (ctx *Context) GetTargetDomain() string {
- if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() {
- return ""
- }
- dest := ctx.Outbound.RouteTarget
- if dest.IsValid() && dest.Address.Family().IsDomain() {
- return dest.Address.Domain()
- }
- dest = ctx.Outbound.Target
- if !dest.Address.Family().IsDomain() {
- return ""
- }
- return dest.Address.Domain()
- }
- // GetNetwork implements routing.Context.
- func (ctx *Context) GetNetwork() net.Network {
- if ctx.Outbound == nil {
- return net.Network_Unknown
- }
- return ctx.Outbound.Target.Network
- }
- // GetProtocol implements routing.Context.
- func (ctx *Context) GetProtocol() string {
- if ctx.Content == nil {
- return ""
- }
- return ctx.Content.Protocol
- }
- // GetUser implements routing.Context.
- func (ctx *Context) GetUser() string {
- if ctx.Inbound == nil || ctx.Inbound.User == nil {
- return ""
- }
- return ctx.Inbound.User.Email
- }
- // GetAttributes implements routing.Context.
- func (ctx *Context) GetAttributes() map[string]string {
- if ctx.Content == nil {
- return nil
- }
- return ctx.Content.Attributes
- }
- // GetSkipDNSResolve implements routing.Context.
- func (ctx *Context) GetSkipDNSResolve() bool {
- if ctx.Content == nil {
- return false
- }
- return ctx.Content.SkipDNSResolve
- }
- // AsRoutingContext creates a context from context.context with session info.
- func AsRoutingContext(ctx context.Context) routing.Context {
- outbounds := session.OutboundsFromContext(ctx)
- ob := outbounds[len(outbounds) - 1]
- return &Context{
- Inbound: session.InboundFromContext(ctx),
- Outbound: ob,
- Content: session.ContentFromContext(ctx),
- }
- }
|