conn_router.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package adapter
  2. import (
  3. "context"
  4. "net"
  5. "github.com/sagernet/sing/common/logger"
  6. M "github.com/sagernet/sing/common/metadata"
  7. N "github.com/sagernet/sing/common/network"
  8. )
  9. type ConnectionRouter interface {
  10. RouteConnection(ctx context.Context, conn net.Conn, metadata InboundContext) error
  11. RoutePacketConnection(ctx context.Context, conn N.PacketConn, metadata InboundContext) error
  12. }
  13. func NewRouteHandler(
  14. metadata InboundContext,
  15. router ConnectionRouter,
  16. logger logger.ContextLogger,
  17. ) UpstreamHandlerAdapter {
  18. return &routeHandlerWrapper{
  19. metadata: metadata,
  20. router: router,
  21. logger: logger,
  22. }
  23. }
  24. func NewRouteContextHandler(
  25. router ConnectionRouter,
  26. logger logger.ContextLogger,
  27. ) UpstreamHandlerAdapter {
  28. return &routeContextHandlerWrapper{
  29. router: router,
  30. logger: logger,
  31. }
  32. }
  33. var _ UpstreamHandlerAdapter = (*routeHandlerWrapper)(nil)
  34. type routeHandlerWrapper struct {
  35. metadata InboundContext
  36. router ConnectionRouter
  37. logger logger.ContextLogger
  38. }
  39. func (w *routeHandlerWrapper) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  40. myMetadata := w.metadata
  41. if metadata.Source.IsValid() {
  42. myMetadata.Source = metadata.Source
  43. }
  44. if metadata.Destination.IsValid() {
  45. myMetadata.Destination = metadata.Destination
  46. }
  47. return w.router.RouteConnection(ctx, conn, myMetadata)
  48. }
  49. func (w *routeHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  50. myMetadata := w.metadata
  51. if metadata.Source.IsValid() {
  52. myMetadata.Source = metadata.Source
  53. }
  54. if metadata.Destination.IsValid() {
  55. myMetadata.Destination = metadata.Destination
  56. }
  57. return w.router.RoutePacketConnection(ctx, conn, myMetadata)
  58. }
  59. func (w *routeHandlerWrapper) NewError(ctx context.Context, err error) {
  60. w.logger.ErrorContext(ctx, err)
  61. }
  62. var _ UpstreamHandlerAdapter = (*routeContextHandlerWrapper)(nil)
  63. type routeContextHandlerWrapper struct {
  64. router ConnectionRouter
  65. logger logger.ContextLogger
  66. }
  67. func (w *routeContextHandlerWrapper) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  68. myMetadata := ContextFrom(ctx)
  69. if metadata.Source.IsValid() {
  70. myMetadata.Source = metadata.Source
  71. }
  72. if metadata.Destination.IsValid() {
  73. myMetadata.Destination = metadata.Destination
  74. }
  75. return w.router.RouteConnection(ctx, conn, *myMetadata)
  76. }
  77. func (w *routeContextHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  78. myMetadata := ContextFrom(ctx)
  79. if metadata.Source.IsValid() {
  80. myMetadata.Source = metadata.Source
  81. }
  82. if metadata.Destination.IsValid() {
  83. myMetadata.Destination = metadata.Destination
  84. }
  85. return w.router.RoutePacketConnection(ctx, conn, *myMetadata)
  86. }
  87. func (w *routeContextHandlerWrapper) NewError(ctx context.Context, err error) {
  88. w.logger.ErrorContext(ctx, err)
  89. }