port_json.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // +build json
  2. package net
  3. import (
  4. "encoding/json"
  5. "strings"
  6. "v2ray.com/core/common/log"
  7. )
  8. func parseIntPort(data []byte) (Port, error) {
  9. var intPort uint32
  10. err := json.Unmarshal(data, &intPort)
  11. if err != nil {
  12. return Port(0), err
  13. }
  14. return PortFromInt(intPort)
  15. }
  16. func parseStringPort(data []byte) (Port, Port, error) {
  17. var s string
  18. err := json.Unmarshal(data, &s)
  19. if err != nil {
  20. return Port(0), Port(0), err
  21. }
  22. pair := strings.SplitN(s, "-", 2)
  23. if len(pair) == 0 {
  24. return Port(0), Port(0), ErrInvalidPortRange
  25. }
  26. if len(pair) == 1 {
  27. port, err := PortFromString(pair[0])
  28. return port, port, err
  29. }
  30. fromPort, err := PortFromString(pair[0])
  31. if err != nil {
  32. return Port(0), Port(0), err
  33. }
  34. toPort, err := PortFromString(pair[1])
  35. if err != nil {
  36. return Port(0), Port(0), err
  37. }
  38. return fromPort, toPort, nil
  39. }
  40. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  41. func (this *PortRange) UnmarshalJSON(data []byte) error {
  42. port, err := parseIntPort(data)
  43. if err == nil {
  44. this.From = uint32(port)
  45. this.To = uint32(port)
  46. return nil
  47. }
  48. from, to, err := parseStringPort(data)
  49. if err == nil {
  50. this.From = uint32(from)
  51. this.To = uint32(to)
  52. if this.From > this.To {
  53. log.Error("Invalid port range ", this.From, " -> ", this.To)
  54. return ErrInvalidPortRange
  55. }
  56. return nil
  57. }
  58. log.Error("Invalid port range: ", string(data))
  59. return ErrInvalidPortRange
  60. }