handler_cache.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package internal
  2. import (
  3. "errors"
  4. "github.com/v2ray/v2ray-core/app"
  5. "github.com/v2ray/v2ray-core/proxy"
  6. "github.com/v2ray/v2ray-core/transport/internet"
  7. )
  8. var (
  9. inboundFactories = make(map[string]InboundHandlerFactory)
  10. outboundFactories = make(map[string]OutboundHandlerFactory)
  11. ErrProxyNotFound = errors.New("Proxy not found.")
  12. ErrNameExists = errors.New("Proxy with the same name already exists.")
  13. ErrBadConfiguration = errors.New("Bad proxy configuration.")
  14. )
  15. func RegisterInboundHandlerCreator(name string, creator InboundHandlerFactory) error {
  16. if _, found := inboundFactories[name]; found {
  17. return ErrNameExists
  18. }
  19. inboundFactories[name] = creator
  20. return nil
  21. }
  22. func MustRegisterInboundHandlerCreator(name string, creator InboundHandlerFactory) {
  23. if err := RegisterInboundHandlerCreator(name, creator); err != nil {
  24. panic(err)
  25. }
  26. }
  27. func RegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) error {
  28. if _, found := outboundFactories[name]; found {
  29. return ErrNameExists
  30. }
  31. outboundFactories[name] = creator
  32. return nil
  33. }
  34. func MustRegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) {
  35. if err := RegisterOutboundHandlerCreator(name, creator); err != nil {
  36. panic(err)
  37. }
  38. }
  39. func CreateInboundHandler(name string, space app.Space, rawConfig []byte, meta *proxy.InboundHandlerMeta) (proxy.InboundHandler, error) {
  40. creator, found := inboundFactories[name]
  41. if !found {
  42. return nil, ErrProxyNotFound
  43. }
  44. if meta.StreamSettings == nil {
  45. meta.StreamSettings = &internet.StreamSettings{
  46. Type: creator.StreamCapability(),
  47. }
  48. } else {
  49. meta.StreamSettings.Type &= creator.StreamCapability()
  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, ErrProxyNotFound
  64. }
  65. if meta.StreamSettings == nil {
  66. meta.StreamSettings = &internet.StreamSettings{
  67. Type: creator.StreamCapability(),
  68. }
  69. } else {
  70. meta.StreamSettings.Type &= creator.StreamCapability()
  71. }
  72. if len(rawConfig) > 0 {
  73. proxyConfig, err := CreateOutboundConfig(name, rawConfig)
  74. if err != nil {
  75. return nil, err
  76. }
  77. return creator.Create(space, proxyConfig, meta)
  78. }
  79. return creator.Create(space, nil, meta)
  80. }