config.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package internet
  2. import "v2ray.com/core/common/serial"
  3. type ConfigCreator func() interface{}
  4. var (
  5. globalTransportConfigCreatorCache = make(map[TransportProtocol]ConfigCreator)
  6. globalTransportSettings []*TransportConfig
  7. )
  8. func RegisterProtocolConfigCreator(protocol TransportProtocol, creator ConfigCreator) error {
  9. if _, found := globalTransportConfigCreatorCache[protocol]; found {
  10. return newError("protocol ", TransportProtocol_name[int32(protocol)], " is already registered").AtError()
  11. }
  12. globalTransportConfigCreatorCache[protocol] = creator
  13. return nil
  14. }
  15. func CreateTransportConfig(protocol TransportProtocol) (interface{}, error) {
  16. creator, ok := globalTransportConfigCreatorCache[protocol]
  17. if !ok {
  18. return nil, newError("unknown transport protocol: ", protocol)
  19. }
  20. return creator(), nil
  21. }
  22. func (c *TransportConfig) GetTypedSettings() (interface{}, error) {
  23. return c.Settings.GetInstance()
  24. }
  25. func (c *StreamConfig) GetEffectiveProtocol() TransportProtocol {
  26. if c == nil {
  27. return TransportProtocol_TCP
  28. }
  29. return c.Protocol
  30. }
  31. func (c *StreamConfig) GetEffectiveTransportSettings() (interface{}, error) {
  32. protocol := c.GetEffectiveProtocol()
  33. if c != nil {
  34. for _, settings := range c.TransportSettings {
  35. if settings.Protocol == protocol {
  36. return settings.GetTypedSettings()
  37. }
  38. }
  39. }
  40. for _, settings := range globalTransportSettings {
  41. if settings.Protocol == protocol {
  42. return settings.GetTypedSettings()
  43. }
  44. }
  45. return CreateTransportConfig(protocol)
  46. }
  47. func (c *StreamConfig) GetTransportSettingsFor(protocol TransportProtocol) (interface{}, error) {
  48. if c != nil {
  49. for _, settings := range c.TransportSettings {
  50. if settings.Protocol == protocol {
  51. return settings.GetTypedSettings()
  52. }
  53. }
  54. }
  55. for _, settings := range globalTransportSettings {
  56. if settings.Protocol == protocol {
  57. return settings.GetTypedSettings()
  58. }
  59. }
  60. return CreateTransportConfig(protocol)
  61. }
  62. func (c *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) {
  63. for _, settings := range c.SecuritySettings {
  64. if settings.Type == c.SecurityType {
  65. return settings.GetInstance()
  66. }
  67. }
  68. return serial.GetInstance(c.SecurityType)
  69. }
  70. func (c *StreamConfig) HasSecuritySettings() bool {
  71. return len(c.SecurityType) > 0
  72. }
  73. func ApplyGlobalTransportSettings(settings []*TransportConfig) error {
  74. globalTransportSettings = settings
  75. return nil
  76. }
  77. func (c *ProxyConfig) HasTag() bool {
  78. return c != nil && len(c.Tag) > 0
  79. }