1
0

hysteria2.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package option
  2. import (
  3. "net/url"
  4. C "github.com/sagernet/sing-box/constant"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. "github.com/sagernet/sing/common/json"
  7. "github.com/sagernet/sing/common/json/badjson"
  8. "github.com/sagernet/sing/common/json/badoption"
  9. )
  10. type Hysteria2InboundOptions struct {
  11. ListenOptions
  12. UpMbps int `json:"up_mbps,omitempty"`
  13. DownMbps int `json:"down_mbps,omitempty"`
  14. Obfs *Hysteria2Obfs `json:"obfs,omitempty"`
  15. Users []Hysteria2User `json:"users,omitempty"`
  16. IgnoreClientBandwidth bool `json:"ignore_client_bandwidth,omitempty"`
  17. InboundTLSOptionsContainer
  18. Masquerade *Hysteria2Masquerade `json:"masquerade,omitempty"`
  19. BrutalDebug bool `json:"brutal_debug,omitempty"`
  20. }
  21. type Hysteria2Obfs struct {
  22. Type string `json:"type,omitempty"`
  23. Password string `json:"password,omitempty"`
  24. }
  25. type Hysteria2User struct {
  26. Name string `json:"name,omitempty"`
  27. Password string `json:"password,omitempty"`
  28. }
  29. type _Hysteria2Masquerade struct {
  30. Type string `json:"type,omitempty"`
  31. FileOptions Hysteria2MasqueradeFile `json:"-"`
  32. ProxyOptions Hysteria2MasqueradeProxy `json:"-"`
  33. StringOptions Hysteria2MasqueradeString `json:"-"`
  34. }
  35. type Hysteria2Masquerade _Hysteria2Masquerade
  36. func (m Hysteria2Masquerade) MarshalJSON() ([]byte, error) {
  37. var v any
  38. switch m.Type {
  39. case C.Hysterai2MasqueradeTypeFile:
  40. v = m.FileOptions
  41. case C.Hysterai2MasqueradeTypeProxy:
  42. v = m.ProxyOptions
  43. case C.Hysterai2MasqueradeTypeString:
  44. v = m.StringOptions
  45. default:
  46. return nil, E.New("unknown masquerade type: ", m.Type)
  47. }
  48. return badjson.MarshallObjects((_Hysteria2Masquerade)(m), v)
  49. }
  50. func (m *Hysteria2Masquerade) UnmarshalJSON(bytes []byte) error {
  51. var urlString string
  52. err := json.Unmarshal(bytes, &urlString)
  53. if err == nil {
  54. masqueradeURL, err := url.Parse(urlString)
  55. if err != nil {
  56. return E.Cause(err, "invalid masquerade URL")
  57. }
  58. switch masqueradeURL.Scheme {
  59. case "file":
  60. m.Type = C.Hysterai2MasqueradeTypeFile
  61. m.FileOptions.Directory = masqueradeURL.Path
  62. case "http", "https":
  63. m.Type = C.Hysterai2MasqueradeTypeProxy
  64. m.ProxyOptions.URL = urlString
  65. default:
  66. return E.New("unknown masquerade URL scheme: ", masqueradeURL.Scheme)
  67. }
  68. return nil
  69. }
  70. err = json.Unmarshal(bytes, (*_Hysteria2Masquerade)(m))
  71. if err != nil {
  72. return err
  73. }
  74. var v any
  75. switch m.Type {
  76. case C.Hysterai2MasqueradeTypeFile:
  77. v = &m.FileOptions
  78. case C.Hysterai2MasqueradeTypeProxy:
  79. v = &m.ProxyOptions
  80. case C.Hysterai2MasqueradeTypeString:
  81. v = &m.StringOptions
  82. default:
  83. return E.New("unknown masquerade type: ", m.Type)
  84. }
  85. return badjson.UnmarshallExcluded(bytes, (*_Hysteria2Masquerade)(m), v)
  86. }
  87. type Hysteria2MasqueradeFile struct {
  88. Directory string `json:"directory"`
  89. }
  90. type Hysteria2MasqueradeProxy struct {
  91. URL string `json:"url"`
  92. RewriteHost bool `json:"rewrite_host,omitempty"`
  93. }
  94. type Hysteria2MasqueradeString struct {
  95. StatusCode int `json:"status_code,omitempty"`
  96. Headers badoption.HTTPHeader `json:"headers,omitempty"`
  97. Content string `json:"content"`
  98. }
  99. type Hysteria2OutboundOptions struct {
  100. DialerOptions
  101. ServerOptions
  102. ServerPorts badoption.Listable[string] `json:"server_ports,omitempty"`
  103. HopInterval badoption.Duration `json:"hop_interval,omitempty"`
  104. UpMbps int `json:"up_mbps,omitempty"`
  105. DownMbps int `json:"down_mbps,omitempty"`
  106. Obfs *Hysteria2Obfs `json:"obfs,omitempty"`
  107. Password string `json:"password,omitempty"`
  108. Network NetworkList `json:"network,omitempty"`
  109. OutboundTLSOptionsContainer
  110. BrutalDebug bool `json:"brutal_debug,omitempty"`
  111. }