upstream.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. func UpstreamMetadata(metadata InboundContext) M.Metadata {
  45. return M.Metadata{
  46. Source: metadata.Source,
  47. Destination: metadata.Destination,
  48. }
  49. }
  50. type myUpstreamContextHandlerWrapper struct {
  51. connectionHandler ConnectionHandlerFunc
  52. packetHandler PacketConnectionHandlerFunc
  53. errorHandler E.Handler
  54. }
  55. func NewUpstreamContextHandler(
  56. connectionHandler ConnectionHandlerFunc,
  57. packetHandler PacketConnectionHandlerFunc,
  58. errorHandler E.Handler,
  59. ) UpstreamHandlerAdapter {
  60. return &myUpstreamContextHandlerWrapper{
  61. connectionHandler: connectionHandler,
  62. packetHandler: packetHandler,
  63. errorHandler: errorHandler,
  64. }
  65. }
  66. func (w *myUpstreamContextHandlerWrapper) NewConnection(ctx context.Context, conn net.Conn, metadata M.Metadata) error {
  67. myMetadata := ContextFrom(ctx)
  68. myMetadata.Destination = metadata.Destination
  69. return w.connectionHandler(ctx, conn, *myMetadata)
  70. }
  71. func (w *myUpstreamContextHandlerWrapper) NewPacketConnection(ctx context.Context, conn N.PacketConn, metadata M.Metadata) error {
  72. myMetadata := ContextFrom(ctx)
  73. myMetadata.Destination = metadata.Destination
  74. return w.packetHandler(ctx, conn, *myMetadata)
  75. }
  76. func (w *myUpstreamContextHandlerWrapper) NewError(ctx context.Context, err error) {
  77. w.errorHandler.NewError(ctx, err)
  78. }