router.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package json
  2. import (
  3. "encoding/json"
  4. v2routerjson "github.com/v2ray/v2ray-core/app/router/json"
  5. "github.com/v2ray/v2ray-core/app/router/rules"
  6. "github.com/v2ray/v2ray-core/common/log"
  7. )
  8. type RouterRuleConfig struct {
  9. RuleList []json.RawMessage `json:"rules"`
  10. }
  11. func parseRule(msg json.RawMessage) rules.Rule {
  12. rule := new(Rule)
  13. err := json.Unmarshal(msg, rule)
  14. if err != nil {
  15. log.Error("Invalid router rule: %v", err)
  16. return nil
  17. }
  18. if rule.Type == "field" {
  19. fieldrule := new(FieldRule)
  20. err = json.Unmarshal(msg, fieldrule)
  21. if err != nil {
  22. log.Error("Invalid field rule: %v", err)
  23. return nil
  24. }
  25. return fieldrule
  26. }
  27. if rule.Type == "chinaip" {
  28. chinaiprule := new(ChinaIPRule)
  29. if err := json.Unmarshal(msg, chinaiprule); err != nil {
  30. log.Error("Invalid chinaip rule: %v", err)
  31. return nil
  32. }
  33. return chinaiprule
  34. }
  35. if rule.Type == "chinasites" {
  36. chinasitesrule := new(ChinaSitesRule)
  37. if err := json.Unmarshal(msg, chinasitesrule); err != nil {
  38. log.Error("Invalid chinasites rule: %v", err)
  39. return nil
  40. }
  41. return chinasitesrule
  42. }
  43. log.Error("Unknown router rule type: %s", rule.Type)
  44. return nil
  45. }
  46. func (this *RouterRuleConfig) Rules() []rules.Rule {
  47. rules := make([]rules.Rule, len(this.RuleList))
  48. for idx, rawRule := range this.RuleList {
  49. rules[idx] = parseRule(rawRule)
  50. }
  51. return rules
  52. }
  53. func init() {
  54. v2routerjson.RegisterRouterConfig("rules", func() interface{} {
  55. return new(RouterRuleConfig)
  56. })
  57. }