|
|
|
package proxy
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"v2ray.com/core/common/net"
|
|
|
|
)
|
|
|
|
|
|
|
|
type key int
|
|
|
|
|
|
|
|
const (
|
|
|
|
sourceKey key = iota
|
|
|
|
destinationKey
|
|
|
|
originalDestinationKey
|
|
|
|
inboundDestinationKey
|
|
|
|
inboundTagKey
|
|
|
|
outboundTagKey
|
|
|
|
resolvedIPsKey
|
|
|
|
allowPassiveConnKey
|
|
|
|
dispatcherKey
|
|
|
|
)
|
|
|
|
|
|
|
|
func ContextWithSource(ctx context.Context, src net.Destination) context.Context {
|
|
|
|
return context.WithValue(ctx, sourceKey, src)
|
|
|
|
}
|
|
|
|
|
|
|
|
func SourceFromContext(ctx context.Context) net.Destination {
|
|
|
|
v := ctx.Value(sourceKey)
|
|
|
|
if v == nil {
|
|
|
|
return net.Destination{}
|
|
|
|
}
|
|
|
|
return v.(net.Destination)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithOriginalDestination(ctx context.Context, dest net.Destination) context.Context {
|
|
|
|
return context.WithValue(ctx, originalDestinationKey, dest)
|
|
|
|
}
|
|
|
|
|
|
|
|
func OriginalDestinationFromContext(ctx context.Context) net.Destination {
|
|
|
|
v := ctx.Value(originalDestinationKey)
|
|
|
|
if v == nil {
|
|
|
|
return net.Destination{}
|
|
|
|
}
|
|
|
|
return v.(net.Destination)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithDestination(ctx context.Context, dest net.Destination) context.Context {
|
|
|
|
return context.WithValue(ctx, destinationKey, dest)
|
|
|
|
}
|
|
|
|
|
|
|
|
func DestinationFromContext(ctx context.Context) net.Destination {
|
|
|
|
v := ctx.Value(destinationKey)
|
|
|
|
if v == nil {
|
|
|
|
return net.Destination{}
|
|
|
|
}
|
|
|
|
return v.(net.Destination)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithInboundDestination(ctx context.Context, dest net.Destination) context.Context {
|
|
|
|
return context.WithValue(ctx, inboundDestinationKey, dest)
|
|
|
|
}
|
|
|
|
|
|
|
|
func InboundDestinationFromContext(ctx context.Context) net.Destination {
|
|
|
|
v := ctx.Value(inboundDestinationKey)
|
|
|
|
if v == nil {
|
|
|
|
return net.Destination{}
|
|
|
|
}
|
|
|
|
return v.(net.Destination)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithInboundTag(ctx context.Context, tag string) context.Context {
|
|
|
|
return context.WithValue(ctx, inboundTagKey, tag)
|
|
|
|
}
|
|
|
|
|
|
|
|
func InboundTagFromContext(ctx context.Context) string {
|
|
|
|
v := ctx.Value(inboundTagKey)
|
|
|
|
if v == nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return v.(string)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithOutboundTag(ctx context.Context, tag string) context.Context {
|
|
|
|
return context.WithValue(ctx, outboundTagKey, tag)
|
|
|
|
}
|
|
|
|
|
|
|
|
func OutboundTagFromContext(ctx context.Context) string {
|
|
|
|
v := ctx.Value(outboundTagKey)
|
|
|
|
if v == nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return v.(string)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithResolveIPs(ctx context.Context, ips []net.Address) context.Context {
|
|
|
|
return context.WithValue(ctx, resolvedIPsKey, ips)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ResolvedIPsFromContext(ctx context.Context) ([]net.Address, bool) {
|
|
|
|
ips, ok := ctx.Value(resolvedIPsKey).([]net.Address)
|
|
|
|
return ips, ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContextWithAllowPassiveConnection(ctx context.Context, allowPassiveConnection bool) context.Context {
|
|
|
|
return context.WithValue(ctx, allowPassiveConnKey, allowPassiveConnection)
|
|
|
|
}
|
|
|
|
|
|
|
|
func AllowPassiveConnectionFromContext(ctx context.Context) (bool, bool) {
|
|
|
|
allow, ok := ctx.Value(allowPassiveConnKey).(bool)
|
|
|
|
return allow, ok
|
|
|
|
}
|