handler.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package outbound
  2. import (
  3. "context"
  4. "v2ray.com/core/app/proxyman"
  5. "v2ray.com/core/common/errors"
  6. "v2ray.com/core/common/net"
  7. "v2ray.com/core/proxy"
  8. "v2ray.com/core/transport/internet"
  9. )
  10. type Handler struct {
  11. config *proxyman.OutboundHandlerConfig
  12. streamSettings *proxyman.StreamSenderConfig
  13. datagramSettings *proxyman.DatagramSenderConfig
  14. proxy proxy.OutboundHandler
  15. }
  16. func NewHandler(ctx context.Context, config *proxyman.OutboundHandlerConfig) (*Handler, error) {
  17. h := &Handler{
  18. config: config,
  19. }
  20. for _, rawSettings := range config.SenderSettings {
  21. settings, err := rawSettings.GetInstance()
  22. if err != nil {
  23. return nil, err
  24. }
  25. switch ts := settings.(type) {
  26. case *proxyman.StreamSenderConfig:
  27. h.streamSettings = ts
  28. case *proxyman.DatagramSenderConfig:
  29. h.datagramSettings = ts
  30. default:
  31. return nil, errors.New("Proxyman|DefaultOutboundHandler: Unknown sender settings: ", rawSettings.Type)
  32. }
  33. }
  34. proxyHandler, err := config.GetProxyHandler(proxy.ContextWithDialer(ctx, h))
  35. if err != nil {
  36. return nil, err
  37. }
  38. h.proxy = proxyHandler
  39. return h, nil
  40. }
  41. func (h *Handler) Dial(ctx context.Context, destination net.Destination) (internet.Connection, error) {
  42. switch destination.Network {
  43. case net.Network_TCP:
  44. return h.dialStream(ctx, destination)
  45. case net.Network_UDP:
  46. return h.dialDatagram(ctx, destination)
  47. default:
  48. panic("Proxyman|DefaultOutboundHandler: unexpected network.")
  49. }
  50. }
  51. func (h *Handler) dialStream(ctx context.Context, destination net.Destination) (internet.Connection, error) {
  52. var src net.Address
  53. if h.streamSettings != nil {
  54. src = h.streamSettings.Via.AsAddress()
  55. }
  56. var options internet.DialerOptions
  57. if h.streamSettings != nil {
  58. options.Proxy = h.streamSettings.ProxySettings
  59. options.Stream = h.streamSettings.StreamSettings
  60. }
  61. return internet.Dial(src, destination, options)
  62. }
  63. func (h *Handler) dialDatagram(ctx context.Context, destination net.Destination) (internet.Connection, error) {
  64. var src net.Address
  65. if h.datagramSettings != nil {
  66. src = h.datagramSettings.Via.AsAddress()
  67. }
  68. var options internet.DialerOptions
  69. if h.datagramSettings != nil {
  70. options.Proxy = h.datagramSettings.ProxySettings
  71. }
  72. return internet.Dial(src, destination, options)
  73. }