handler_cache.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package proxy
  2. import (
  3. "v2ray.com/core/app"
  4. "v2ray.com/core/common"
  5. "v2ray.com/core/common/errors"
  6. "v2ray.com/core/transport/internet"
  7. )
  8. var (
  9. inboundFactories = make(map[string]InboundHandlerFactory)
  10. outboundFactories = make(map[string]OutboundHandlerFactory)
  11. )
  12. func RegisterInboundHandlerCreator(name string, creator InboundHandlerFactory) error {
  13. if _, found := inboundFactories[name]; found {
  14. return common.ErrDuplicatedName
  15. }
  16. inboundFactories[name] = creator
  17. return nil
  18. }
  19. func MustRegisterInboundHandlerCreator(name string, creator InboundHandlerFactory) {
  20. if err := RegisterInboundHandlerCreator(name, creator); err != nil {
  21. panic(err)
  22. }
  23. }
  24. func RegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) error {
  25. if _, found := outboundFactories[name]; found {
  26. return common.ErrDuplicatedName
  27. }
  28. outboundFactories[name] = creator
  29. return nil
  30. }
  31. func MustRegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) {
  32. if err := RegisterOutboundHandlerCreator(name, creator); err != nil {
  33. panic(err)
  34. }
  35. }
  36. func CreateInboundHandler(name string, space app.Space, config interface{}, meta *InboundHandlerMeta) (InboundHandler, error) {
  37. creator, found := inboundFactories[name]
  38. if !found {
  39. return nil, errors.New("Proxy: Unknown inbound name: " + name)
  40. }
  41. if meta.StreamSettings == nil {
  42. meta.StreamSettings = &internet.StreamConfig{
  43. Network: creator.StreamCapability().Get(0),
  44. }
  45. } else {
  46. if !creator.StreamCapability().HasNetwork(meta.StreamSettings.Network) {
  47. return nil, errors.New("Proxy: Invalid network: " + meta.StreamSettings.Network.String())
  48. }
  49. }
  50. return creator.Create(space, config, meta)
  51. }
  52. func CreateOutboundHandler(name string, space app.Space, config interface{}, meta *OutboundHandlerMeta) (OutboundHandler, error) {
  53. creator, found := outboundFactories[name]
  54. if !found {
  55. return nil, errors.New("Proxy: Unknown outbound name: " + name)
  56. }
  57. if meta.StreamSettings == nil {
  58. meta.StreamSettings = &internet.StreamConfig{
  59. Network: creator.StreamCapability().Get(0),
  60. }
  61. } else {
  62. if !creator.StreamCapability().HasNetwork(meta.StreamSettings.Network) {
  63. return nil, errors.New("Proxy: Invalid network: " + meta.StreamSettings.Network.String())
  64. }
  65. }
  66. return creator.Create(space, config, meta)
  67. }