router.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. log.Error("Unknown router rule type: %s", rule.Type)
  36. return nil
  37. }
  38. func (this *RouterRuleConfig) Rules() []rules.Rule {
  39. rules := make([]rules.Rule, len(this.RuleList))
  40. for idx, rawRule := range this.RuleList {
  41. rules[idx] = parseRule(rawRule)
  42. }
  43. return rules
  44. }
  45. func init() {
  46. v2routerjson.RegisterRouterConfig("rules", func() interface{} {
  47. return new(RouterRuleConfig)
  48. })
  49. }