network.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package core
  2. import (
  3. "context"
  4. "sync"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/net"
  7. "v2ray.com/core/transport/ray"
  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. // OutboundHandler is the interface for handlers that process outbound connections.
  18. type OutboundHandler interface {
  19. common.Runnable
  20. Tag() string
  21. Dispatch(ctx context.Context, outboundRay ray.OutboundRay)
  22. }
  23. // InboundHandlerManager is a feature that managers InboundHandlers.
  24. type InboundHandlerManager interface {
  25. Feature
  26. // GetHandlers returns an InboundHandler for the given tag.
  27. GetHandler(ctx context.Context, tag string) (InboundHandler, error)
  28. // AddHandler adds the given handler into this InboundHandlerManager.
  29. AddHandler(ctx context.Context, handler InboundHandler) error
  30. // RemoveHandler removes a handler from InboundHandlerManager.
  31. RemoveHandler(ctx context.Context, tag string) error
  32. }
  33. type syncInboundHandlerManager struct {
  34. sync.RWMutex
  35. InboundHandlerManager
  36. }
  37. func (m *syncInboundHandlerManager) GetHandler(ctx context.Context, tag string) (InboundHandler, error) {
  38. m.RLock()
  39. defer m.RUnlock()
  40. if m.InboundHandlerManager == nil {
  41. return nil, newError("InboundHandlerManager not set.").AtError()
  42. }
  43. return m.InboundHandlerManager.GetHandler(ctx, tag)
  44. }
  45. func (m *syncInboundHandlerManager) AddHandler(ctx context.Context, handler InboundHandler) error {
  46. m.RLock()
  47. defer m.RUnlock()
  48. if m.InboundHandlerManager == nil {
  49. return newError("InboundHandlerManager not set.").AtError()
  50. }
  51. return m.InboundHandlerManager.AddHandler(ctx, handler)
  52. }
  53. func (m *syncInboundHandlerManager) Start() error {
  54. m.RLock()
  55. defer m.RUnlock()
  56. if m.InboundHandlerManager == nil {
  57. return newError("InboundHandlerManager not set.").AtError()
  58. }
  59. return m.InboundHandlerManager.Start()
  60. }
  61. func (m *syncInboundHandlerManager) Close() error {
  62. m.RLock()
  63. defer m.RUnlock()
  64. return common.Close(m.InboundHandlerManager)
  65. }
  66. func (m *syncInboundHandlerManager) Set(manager InboundHandlerManager) {
  67. if manager == nil {
  68. return
  69. }
  70. m.Lock()
  71. defer m.Unlock()
  72. common.Close(m.InboundHandlerManager)
  73. m.InboundHandlerManager = manager
  74. }
  75. // OutboundHandlerManager is a feature that manages OutboundHandlers.
  76. type OutboundHandlerManager interface {
  77. Feature
  78. // GetHandler returns an OutboundHandler will given tag.
  79. GetHandler(tag string) OutboundHandler
  80. // GetDefaultHandler returns the default OutboundHandler. It is usually the first OutboundHandler specified in the configuration.
  81. GetDefaultHandler() OutboundHandler
  82. // AddHandler adds a handler into this OutboundHandlerManager.
  83. AddHandler(ctx context.Context, handler OutboundHandler) error
  84. // RemoveHandler removes a handler from OutboundHandlerManager.
  85. RemoveHandler(ctx context.Context, tag string) error
  86. }
  87. type syncOutboundHandlerManager struct {
  88. sync.RWMutex
  89. OutboundHandlerManager
  90. }
  91. func (m *syncOutboundHandlerManager) GetHandler(tag string) OutboundHandler {
  92. m.RLock()
  93. defer m.RUnlock()
  94. if m.OutboundHandlerManager == nil {
  95. return nil
  96. }
  97. return m.OutboundHandlerManager.GetHandler(tag)
  98. }
  99. func (m *syncOutboundHandlerManager) GetDefaultHandler() OutboundHandler {
  100. m.RLock()
  101. defer m.RUnlock()
  102. if m.OutboundHandlerManager == nil {
  103. return nil
  104. }
  105. return m.OutboundHandlerManager.GetDefaultHandler()
  106. }
  107. func (m *syncOutboundHandlerManager) AddHandler(ctx context.Context, handler OutboundHandler) error {
  108. m.RLock()
  109. defer m.RUnlock()
  110. if m.OutboundHandlerManager == nil {
  111. return newError("OutboundHandlerManager not set.").AtError()
  112. }
  113. return m.OutboundHandlerManager.AddHandler(ctx, handler)
  114. }
  115. func (m *syncOutboundHandlerManager) Start() error {
  116. m.RLock()
  117. defer m.RUnlock()
  118. if m.OutboundHandlerManager == nil {
  119. return newError("OutboundHandlerManager not set.").AtError()
  120. }
  121. return m.OutboundHandlerManager.Start()
  122. }
  123. func (m *syncOutboundHandlerManager) Close() error {
  124. m.RLock()
  125. defer m.RUnlock()
  126. return common.Close(m.OutboundHandlerManager)
  127. }
  128. func (m *syncOutboundHandlerManager) Set(manager OutboundHandlerManager) {
  129. if manager == nil {
  130. return
  131. }
  132. m.Lock()
  133. defer m.Unlock()
  134. common.Close(m.OutboundHandlerManager)
  135. m.OutboundHandlerManager = manager
  136. }