handler_cache.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 RegisterOutboundHandlerCreator(name string, creator OutboundHandlerFactory) error {
  20. if _, found := outboundFactories[name]; found {
  21. return common.ErrDuplicatedName
  22. }
  23. outboundFactories[name] = creator
  24. return nil
  25. }
  26. func CreateInboundHandler(name string, space app.Space, config interface{}, meta *InboundHandlerMeta) (InboundHandler, error) {
  27. creator, found := inboundFactories[name]
  28. if !found {
  29. return nil, errors.New("Proxy: Unknown inbound name: " + name)
  30. }
  31. if meta.StreamSettings == nil {
  32. meta.StreamSettings = &internet.StreamConfig{
  33. Network: creator.StreamCapability().Get(0),
  34. }
  35. } else {
  36. if !creator.StreamCapability().HasNetwork(meta.StreamSettings.Network) {
  37. return nil, errors.New("Proxy: Invalid network: " + meta.StreamSettings.Network.String())
  38. }
  39. }
  40. return creator.Create(space, config, meta)
  41. }
  42. func CreateOutboundHandler(name string, space app.Space, config interface{}, meta *OutboundHandlerMeta) (OutboundHandler, error) {
  43. creator, found := outboundFactories[name]
  44. if !found {
  45. return nil, errors.New("Proxy: Unknown outbound name: " + name)
  46. }
  47. if meta.StreamSettings == nil {
  48. meta.StreamSettings = &internet.StreamConfig{
  49. Network: creator.StreamCapability().Get(0),
  50. }
  51. } else {
  52. if !creator.StreamCapability().HasNetwork(meta.StreamSettings.Network) {
  53. return nil, errors.New("Proxy: Invalid network: " + meta.StreamSettings.Network.String())
  54. }
  55. }
  56. return creator.Create(space, config, meta)
  57. }