| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 | 
							- package core
 
- import (
 
- 	"context"
 
- 	"sync"
 
- 	"v2ray.com/core/common"
 
- 	"v2ray.com/core/common/net"
 
- )
 
- // InboundHandler is the interface for handlers that process inbound connections.
 
- type InboundHandler interface {
 
- 	common.Runnable
 
- 	// The tag of this handler.
 
- 	Tag() string
 
- 	// Deprecated. Do not use in new code.
 
- 	GetRandomInboundProxy() (interface{}, net.Port, int)
 
- }
 
- // OutboundHandler is the interface for handlers that process outbound connections.
 
- type OutboundHandler interface {
 
- 	common.Runnable
 
- 	Tag() string
 
- 	Dispatch(ctx context.Context, link *Link)
 
- }
 
- // InboundHandlerManager is a feature that manages InboundHandlers.
 
- type InboundHandlerManager interface {
 
- 	Feature
 
- 	// GetHandlers returns an InboundHandler for the given tag.
 
- 	GetHandler(ctx context.Context, tag string) (InboundHandler, error)
 
- 	// AddHandler adds the given handler into this InboundHandlerManager.
 
- 	AddHandler(ctx context.Context, handler InboundHandler) error
 
- 	// RemoveHandler removes a handler from InboundHandlerManager.
 
- 	RemoveHandler(ctx context.Context, tag string) error
 
- }
 
- type syncInboundHandlerManager struct {
 
- 	sync.RWMutex
 
- 	InboundHandlerManager
 
- }
 
- func (m *syncInboundHandlerManager) GetHandler(ctx context.Context, tag string) (InboundHandler, error) {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.InboundHandlerManager == nil {
 
- 		return nil, newError("InboundHandlerManager not set.").AtError()
 
- 	}
 
- 	return m.InboundHandlerManager.GetHandler(ctx, tag)
 
- }
 
- func (m *syncInboundHandlerManager) AddHandler(ctx context.Context, handler InboundHandler) error {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.InboundHandlerManager == nil {
 
- 		return newError("InboundHandlerManager not set.").AtError()
 
- 	}
 
- 	return m.InboundHandlerManager.AddHandler(ctx, handler)
 
- }
 
- func (m *syncInboundHandlerManager) Start() error {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.InboundHandlerManager == nil {
 
- 		return newError("InboundHandlerManager not set.").AtError()
 
- 	}
 
- 	return m.InboundHandlerManager.Start()
 
- }
 
- func (m *syncInboundHandlerManager) Close() error {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	return common.Close(m.InboundHandlerManager)
 
- }
 
- func (m *syncInboundHandlerManager) Set(manager InboundHandlerManager) {
 
- 	if manager == nil {
 
- 		return
 
- 	}
 
- 	m.Lock()
 
- 	defer m.Unlock()
 
- 	common.Close(m.InboundHandlerManager)
 
- 	m.InboundHandlerManager = manager
 
- }
 
- // OutboundHandlerManager is a feature that manages OutboundHandlers.
 
- type OutboundHandlerManager interface {
 
- 	Feature
 
- 	// GetHandler returns an OutboundHandler for the given tag.
 
- 	GetHandler(tag string) OutboundHandler
 
- 	// GetDefaultHandler returns the default OutboundHandler. It is usually the first OutboundHandler specified in the configuration.
 
- 	GetDefaultHandler() OutboundHandler
 
- 	// AddHandler adds a handler into this OutboundHandlerManager.
 
- 	AddHandler(ctx context.Context, handler OutboundHandler) error
 
- 	// RemoveHandler removes a handler from OutboundHandlerManager.
 
- 	RemoveHandler(ctx context.Context, tag string) error
 
- }
 
- type syncOutboundHandlerManager struct {
 
- 	sync.RWMutex
 
- 	OutboundHandlerManager
 
- }
 
- func (m *syncOutboundHandlerManager) GetHandler(tag string) OutboundHandler {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.OutboundHandlerManager == nil {
 
- 		return nil
 
- 	}
 
- 	return m.OutboundHandlerManager.GetHandler(tag)
 
- }
 
- func (m *syncOutboundHandlerManager) GetDefaultHandler() OutboundHandler {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.OutboundHandlerManager == nil {
 
- 		return nil
 
- 	}
 
- 	return m.OutboundHandlerManager.GetDefaultHandler()
 
- }
 
- func (m *syncOutboundHandlerManager) AddHandler(ctx context.Context, handler OutboundHandler) error {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.OutboundHandlerManager == nil {
 
- 		return newError("OutboundHandlerManager not set.").AtError()
 
- 	}
 
- 	return m.OutboundHandlerManager.AddHandler(ctx, handler)
 
- }
 
- func (m *syncOutboundHandlerManager) Start() error {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	if m.OutboundHandlerManager == nil {
 
- 		return newError("OutboundHandlerManager not set.").AtError()
 
- 	}
 
- 	return m.OutboundHandlerManager.Start()
 
- }
 
- func (m *syncOutboundHandlerManager) Close() error {
 
- 	m.RLock()
 
- 	defer m.RUnlock()
 
- 	return common.Close(m.OutboundHandlerManager)
 
- }
 
- func (m *syncOutboundHandlerManager) Set(manager OutboundHandlerManager) {
 
- 	if manager == nil {
 
- 		return
 
- 	}
 
- 	m.Lock()
 
- 	defer m.Unlock()
 
- 	common.Close(m.OutboundHandlerManager)
 
- 	m.OutboundHandlerManager = manager
 
- }
 
 
  |