| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | 
							- package redirect
 
- import (
 
- 	"context"
 
- 	"net"
 
- 	"github.com/sagernet/sing-box/adapter"
 
- 	"github.com/sagernet/sing-box/adapter/inbound"
 
- 	"github.com/sagernet/sing-box/common/listener"
 
- 	"github.com/sagernet/sing-box/common/redir"
 
- 	C "github.com/sagernet/sing-box/constant"
 
- 	"github.com/sagernet/sing-box/log"
 
- 	"github.com/sagernet/sing-box/option"
 
- 	M "github.com/sagernet/sing/common/metadata"
 
- 	N "github.com/sagernet/sing/common/network"
 
- )
 
- func RegisterRedirect(registry *inbound.Registry) {
 
- 	inbound.Register[option.RedirectInboundOptions](registry, C.TypeRedirect, NewRedirect)
 
- }
 
- type Redirect struct {
 
- 	inbound.Adapter
 
- 	router   adapter.Router
 
- 	logger   log.ContextLogger
 
- 	listener *listener.Listener
 
- }
 
- func NewRedirect(ctx context.Context, router adapter.Router, logger log.ContextLogger, tag string, options option.RedirectInboundOptions) (adapter.Inbound, error) {
 
- 	redirect := &Redirect{
 
- 		Adapter: inbound.NewAdapter(C.TypeRedirect, tag),
 
- 		router:  router,
 
- 		logger:  logger,
 
- 	}
 
- 	redirect.listener = listener.New(listener.Options{
 
- 		Context:           ctx,
 
- 		Logger:            logger,
 
- 		Network:           []string{N.NetworkTCP},
 
- 		Listen:            options.ListenOptions,
 
- 		ConnectionHandler: redirect,
 
- 	})
 
- 	return redirect, nil
 
- }
 
- func (h *Redirect) Start(stage adapter.StartStage) error {
 
- 	if stage != adapter.StartStateStart {
 
- 		return nil
 
- 	}
 
- 	return h.listener.Start()
 
- }
 
- func (h *Redirect) Close() error {
 
- 	return h.listener.Close()
 
- }
 
- func (h *Redirect) NewConnectionEx(ctx context.Context, conn net.Conn, metadata adapter.InboundContext, onClose N.CloseHandlerFunc) {
 
- 	destination, err := redir.GetOriginalDestination(conn)
 
- 	if err != nil {
 
- 		conn.Close()
 
- 		h.logger.ErrorContext(ctx, "process connection from ", conn.RemoteAddr(), ": get redirect destination: ", err)
 
- 		return
 
- 	}
 
- 	metadata.Inbound = h.Tag()
 
- 	metadata.InboundType = h.Type()
 
- 	metadata.Destination = M.SocksaddrFromNetIP(destination)
 
- 	h.logger.InfoContext(ctx, "inbound connection to ", metadata.Destination)
 
- 	h.router.RouteConnectionEx(ctx, conn, metadata, onClose)
 
- }
 
 
  |