outbound.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package outbound
  2. import (
  3. "sync"
  4. "v2ray.com/core/app"
  5. "v2ray.com/core/app/proxyman"
  6. "v2ray.com/core/common"
  7. "v2ray.com/core/proxy"
  8. )
  9. type DefaultOutboundHandlerManager struct {
  10. sync.RWMutex
  11. defaultHandler proxy.OutboundHandler
  12. taggedHandler map[string]proxy.OutboundHandler
  13. }
  14. func New() *DefaultOutboundHandlerManager {
  15. return &DefaultOutboundHandlerManager{
  16. taggedHandler: make(map[string]proxy.OutboundHandler),
  17. }
  18. }
  19. func (v *DefaultOutboundHandlerManager) GetDefaultHandler() proxy.OutboundHandler {
  20. v.RLock()
  21. defer v.RUnlock()
  22. if v.defaultHandler == nil {
  23. return nil
  24. }
  25. return v.defaultHandler
  26. }
  27. func (v *DefaultOutboundHandlerManager) SetDefaultHandler(handler proxy.OutboundHandler) error {
  28. v.Lock()
  29. defer v.Unlock()
  30. v.defaultHandler = handler
  31. return nil
  32. }
  33. func (v *DefaultOutboundHandlerManager) GetHandler(tag string) proxy.OutboundHandler {
  34. v.RLock()
  35. defer v.RUnlock()
  36. if handler, found := v.taggedHandler[tag]; found {
  37. return handler
  38. }
  39. return nil
  40. }
  41. func (v *DefaultOutboundHandlerManager) SetHandler(tag string, handler proxy.OutboundHandler) error {
  42. v.Lock()
  43. defer v.Unlock()
  44. v.taggedHandler[tag] = handler
  45. return nil
  46. }
  47. type OutboundHandlerManagerFactory struct{}
  48. func (v OutboundHandlerManagerFactory) Create(space app.Space, config interface{}) (app.Application, error) {
  49. return New(), nil
  50. }
  51. func init() {
  52. common.Must(app.RegisterApplicationFactory((*proxyman.OutboundConfig)(nil), OutboundHandlerManagerFactory{}))
  53. }