network.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package core
  2. import (
  3. "context"
  4. "sync"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/net"
  7. "v2ray.com/core/features/outbound"
  8. )
  9. // InboundHandler is the interface for handlers that process inbound connections.
  10. type InboundHandler interface {
  11. common.Runnable
  12. // The tag of this handler.
  13. Tag() string
  14. // Deprecated. Do not use in new code.
  15. GetRandomInboundProxy() (interface{}, net.Port, int)
  16. }
  17. // InboundHandlerManager is a feature that manages InboundHandlers.
  18. type InboundHandlerManager interface {
  19. Feature
  20. // GetHandlers returns an InboundHandler for the given tag.
  21. GetHandler(ctx context.Context, tag string) (InboundHandler, error)
  22. // AddHandler adds the given handler into this InboundHandlerManager.
  23. AddHandler(ctx context.Context, handler InboundHandler) error
  24. // RemoveHandler removes a handler from InboundHandlerManager.
  25. RemoveHandler(ctx context.Context, tag string) error
  26. }
  27. type syncInboundHandlerManager struct {
  28. sync.RWMutex
  29. InboundHandlerManager
  30. }
  31. func (m *syncInboundHandlerManager) GetHandler(ctx context.Context, tag string) (InboundHandler, error) {
  32. m.RLock()
  33. defer m.RUnlock()
  34. if m.InboundHandlerManager == nil {
  35. return nil, newError("InboundHandlerManager not set.").AtError()
  36. }
  37. return m.InboundHandlerManager.GetHandler(ctx, tag)
  38. }
  39. func (m *syncInboundHandlerManager) AddHandler(ctx context.Context, handler InboundHandler) error {
  40. m.RLock()
  41. defer m.RUnlock()
  42. if m.InboundHandlerManager == nil {
  43. return newError("InboundHandlerManager not set.").AtError()
  44. }
  45. return m.InboundHandlerManager.AddHandler(ctx, handler)
  46. }
  47. func (m *syncInboundHandlerManager) Start() error {
  48. m.RLock()
  49. defer m.RUnlock()
  50. if m.InboundHandlerManager == nil {
  51. return newError("InboundHandlerManager not set.").AtError()
  52. }
  53. return m.InboundHandlerManager.Start()
  54. }
  55. func (m *syncInboundHandlerManager) Close() error {
  56. m.RLock()
  57. defer m.RUnlock()
  58. return common.Close(m.InboundHandlerManager)
  59. }
  60. func (m *syncInboundHandlerManager) Set(manager InboundHandlerManager) {
  61. if manager == nil {
  62. return
  63. }
  64. m.Lock()
  65. defer m.Unlock()
  66. common.Close(m.InboundHandlerManager) // nolint: errcheck
  67. m.InboundHandlerManager = manager
  68. }
  69. type syncOutboundHandlerManager struct {
  70. sync.RWMutex
  71. outbound.HandlerManager
  72. }
  73. func (m *syncOutboundHandlerManager) GetHandler(tag string) outbound.Handler {
  74. m.RLock()
  75. defer m.RUnlock()
  76. if m.HandlerManager == nil {
  77. return nil
  78. }
  79. return m.HandlerManager.GetHandler(tag)
  80. }
  81. func (m *syncOutboundHandlerManager) GetDefaultHandler() outbound.Handler {
  82. m.RLock()
  83. defer m.RUnlock()
  84. if m.HandlerManager == nil {
  85. return nil
  86. }
  87. return m.HandlerManager.GetDefaultHandler()
  88. }
  89. func (m *syncOutboundHandlerManager) AddHandler(ctx context.Context, handler outbound.Handler) error {
  90. m.RLock()
  91. defer m.RUnlock()
  92. if m.HandlerManager == nil {
  93. return newError("OutboundHandlerManager not set.").AtError()
  94. }
  95. return m.HandlerManager.AddHandler(ctx, handler)
  96. }
  97. func (m *syncOutboundHandlerManager) Start() error {
  98. m.RLock()
  99. defer m.RUnlock()
  100. if m.HandlerManager == nil {
  101. return newError("OutboundHandlerManager not set.").AtError()
  102. }
  103. return m.HandlerManager.Start()
  104. }
  105. func (m *syncOutboundHandlerManager) Close() error {
  106. m.RLock()
  107. defer m.RUnlock()
  108. return common.Close(m.HandlerManager)
  109. }
  110. func (m *syncOutboundHandlerManager) Set(manager outbound.HandlerManager) {
  111. if manager == nil {
  112. return
  113. }
  114. m.Lock()
  115. defer m.Unlock()
  116. common.Close(m.HandlerManager) // nolint: errcheck
  117. m.HandlerManager = manager
  118. }