upstream.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package adapter
  2. import (
  3. "context"
  4. "net"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. M "github.com/sagernet/sing/common/metadata"
  7. N "github.com/sagernet/sing/common/network"
  8. )
  9. type (
  10. ConnectionHandlerFunc = func(ctx context.Context, conn net.Conn, metadata InboundContext) error
  11. PacketConnectionHandlerFunc = func(ctx context.Context, conn N.PacketConn, metadata InboundContext) error
  12. )
  13. func NewUpstreamHandler(
  14. metadata InboundContext,
  15. connectionHandler ConnectionHandlerFunc,
  16. packetHandler PacketConnectionHandlerFunc,
  17. errorHandler E.Handler,
  18. ) UpstreamHandlerAdapter {
  19. return &myUpstreamHandlerWrapper{
  20. metadata: metadata,
  21. connectionHandler: connectionHandler,
  22. packetHandler: packetHandler,
  23. errorHandler: errorHandler,
  24. }
  25. }
  26. var _ UpstreamHandlerAdapter = (*myUpstreamHandlerWrapper)(nil)
  27. type myUpstreamHandlerWrapper struct {
  28. metadata InboundContext
  29. connectionHandler ConnectionHandlerFunc
  30. packetHandler PacketConnectionHandlerFunc
  31. errorHandler E.Handler
  32. }
  33. func (w *myUpstreamHandlerWrapper) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  34. myMetadata := w.metadata
  35. if metadata.Source.IsValid() {
  36. myMetadata.Source = metadata.Source
  37. }
  38. if metadata.Destination.IsValid() {
  39. myMetadata.Destination = metadata.Destination
  40. }
  41. return w.connectionHandler(ctx, conn, myMetadata)
  42. }
  43. func (w *myUpstreamHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  44. myMetadata := w.metadata
  45. if metadata.Source.IsValid() {
  46. myMetadata.Source = metadata.Source
  47. }
  48. if metadata.Destination.IsValid() {
  49. myMetadata.Destination = metadata.Destination
  50. }
  51. return w.packetHandler(ctx, conn, myMetadata)
  52. }
  53. func (w *myUpstreamHandlerWrapper) NewError(ctx context.Context, err error) {
  54. w.errorHandler.NewError(ctx, err)
  55. }
  56. func UpstreamMetadata(metadata InboundContext) M.Metadata {
  57. return M.Metadata{
  58. Source: metadata.Source,
  59. Destination: metadata.Destination,
  60. }
  61. }
  62. type myUpstreamContextHandlerWrapper struct {
  63. connectionHandler ConnectionHandlerFunc
  64. packetHandler PacketConnectionHandlerFunc
  65. errorHandler E.Handler
  66. }
  67. func NewUpstreamContextHandler(
  68. connectionHandler ConnectionHandlerFunc,
  69. packetHandler PacketConnectionHandlerFunc,
  70. errorHandler E.Handler,
  71. ) UpstreamHandlerAdapter {
  72. return &myUpstreamContextHandlerWrapper{
  73. connectionHandler: connectionHandler,
  74. packetHandler: packetHandler,
  75. errorHandler: errorHandler,
  76. }
  77. }
  78. func (w *myUpstreamContextHandlerWrapper) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  79. myMetadata := ContextFrom(ctx)
  80. if metadata.Source.IsValid() {
  81. myMetadata.Source = metadata.Source
  82. }
  83. if metadata.Destination.IsValid() {
  84. myMetadata.Destination = metadata.Destination
  85. }
  86. return w.connectionHandler(ctx, conn, *myMetadata)
  87. }
  88. func (w *myUpstreamContextHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  89. myMetadata := ContextFrom(ctx)
  90. if metadata.Source.IsValid() {
  91. myMetadata.Source = metadata.Source
  92. }
  93. if metadata.Destination.IsValid() {
  94. myMetadata.Destination = metadata.Destination
  95. }
  96. return w.packetHandler(ctx, conn, *myMetadata)
  97. }
  98. func (w *myUpstreamContextHandlerWrapper) NewError(ctx context.Context, err error) {
  99. w.errorHandler.NewError(ctx, err)
  100. }