proxyman.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package proxyman
  2. import (
  3. "sync"
  4. "v2ray.com/core/app"
  5. "v2ray.com/core/proxy"
  6. )
  7. const (
  8. APP_ID_INBOUND_MANAGER = app.ID(4)
  9. APP_ID_OUTBOUND_MANAGER = app.ID(6)
  10. )
  11. type InboundHandlerManager interface {
  12. GetHandler(tag string) (proxy.InboundHandler, int)
  13. }
  14. type OutboundHandlerManager interface {
  15. GetHandler(tag string) proxy.OutboundHandler
  16. GetDefaultHandler() proxy.OutboundHandler
  17. }
  18. type DefaultOutboundHandlerManager struct {
  19. sync.RWMutex
  20. defaultHandler proxy.OutboundHandler
  21. taggedHandler map[string]proxy.OutboundHandler
  22. }
  23. func NewDefaultOutboundHandlerManager() *DefaultOutboundHandlerManager {
  24. return &DefaultOutboundHandlerManager{
  25. taggedHandler: make(map[string]proxy.OutboundHandler),
  26. }
  27. }
  28. func (v *DefaultOutboundHandlerManager) Release() {
  29. }
  30. func (v *DefaultOutboundHandlerManager) GetDefaultHandler() proxy.OutboundHandler {
  31. v.RLock()
  32. defer v.RUnlock()
  33. if v.defaultHandler == nil {
  34. return nil
  35. }
  36. return v.defaultHandler
  37. }
  38. func (v *DefaultOutboundHandlerManager) SetDefaultHandler(handler proxy.OutboundHandler) {
  39. v.Lock()
  40. defer v.Unlock()
  41. v.defaultHandler = handler
  42. }
  43. func (v *DefaultOutboundHandlerManager) GetHandler(tag string) proxy.OutboundHandler {
  44. v.RLock()
  45. defer v.RUnlock()
  46. if handler, found := v.taggedHandler[tag]; found {
  47. return handler
  48. }
  49. return nil
  50. }
  51. func (v *DefaultOutboundHandlerManager) SetHandler(tag string, handler proxy.OutboundHandler) {
  52. v.Lock()
  53. defer v.Unlock()
  54. v.taggedHandler[tag] = handler
  55. }