upstream.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. w.metadata.Destination = metadata.Destination
  35. return w.connectionHandler(ctx, conn, w.metadata)
  36. }
  37. func (w *myUpstreamHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  38. w.metadata.Destination = metadata.Destination
  39. return w.packetHandler(ctx, conn, w.metadata)
  40. }
  41. func (w *myUpstreamHandlerWrapper) NewError(ctx context.Context, err error) {
  42. w.errorHandler.NewError(ctx, err)
  43. }
  44. var myContextType = (*MetadataContext)(nil)
  45. type MetadataContext struct {
  46. context.Context
  47. Metadata InboundContext
  48. }
  49. func (c *MetadataContext) Value(key any) any {
  50. if key == myContextType {
  51. return c
  52. }
  53. return c.Context.Value(key)
  54. }
  55. func ContextWithMetadata(ctx context.Context, metadata InboundContext) context.Context {
  56. return &MetadataContext{
  57. Context: ctx,
  58. Metadata: metadata,
  59. }
  60. }
  61. func UpstreamMetadata(metadata InboundContext) M.Metadata {
  62. return M.Metadata{
  63. Source: metadata.Source,
  64. Destination: metadata.Destination,
  65. }
  66. }
  67. type myUpstreamContextHandlerWrapper struct {
  68. connectionHandler ConnectionHandlerFunc
  69. packetHandler PacketConnectionHandlerFunc
  70. errorHandler E.Handler
  71. }
  72. func NewUpstreamContextHandler(
  73. connectionHandler ConnectionHandlerFunc,
  74. packetHandler PacketConnectionHandlerFunc,
  75. errorHandler E.Handler,
  76. ) UpstreamHandlerAdapter {
  77. return &myUpstreamContextHandlerWrapper{
  78. connectionHandler: connectionHandler,
  79. packetHandler: packetHandler,
  80. errorHandler: errorHandler,
  81. }
  82. }
  83. func (w *myUpstreamContextHandlerWrapper) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  84. myCtx := ctx.Value(myContextType).(*MetadataContext)
  85. myCtx.Metadata.Destination = metadata.Destination
  86. return w.connectionHandler(ctx, conn, myCtx.Metadata)
  87. }
  88. func (w *myUpstreamContextHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  89. myCtx := ctx.Value(myContextType).(*MetadataContext)
  90. myCtx.Metadata.Destination = metadata.Destination
  91. return w.packetHandler(ctx, conn, myCtx.Metadata)
  92. }
  93. func (w *myUpstreamContextHandlerWrapper) NewError(ctx context.Context, err error) {
  94. w.errorHandler.NewError(ctx, err)
  95. }