handler_cache.go 2.6 KB

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