v2ray_transport.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package option
  2. import (
  3. C "github.com/sagernet/sing-box/constant"
  4. E "github.com/sagernet/sing/common/exceptions"
  5. "github.com/sagernet/sing/common/json"
  6. "github.com/sagernet/sing/common/json/badjson"
  7. )
  8. type _V2RayTransportOptions struct {
  9. Type string `json:"type"`
  10. HTTPOptions V2RayHTTPOptions `json:"-"`
  11. WebsocketOptions V2RayWebsocketOptions `json:"-"`
  12. QUICOptions V2RayQUICOptions `json:"-"`
  13. GRPCOptions V2RayGRPCOptions `json:"-"`
  14. HTTPUpgradeOptions V2RayHTTPUpgradeOptions `json:"-"`
  15. }
  16. type V2RayTransportOptions _V2RayTransportOptions
  17. func (o V2RayTransportOptions) MarshalJSON() ([]byte, error) {
  18. var v any
  19. switch o.Type {
  20. case C.V2RayTransportTypeHTTP:
  21. v = o.HTTPOptions
  22. case C.V2RayTransportTypeWebsocket:
  23. v = o.WebsocketOptions
  24. case C.V2RayTransportTypeQUIC:
  25. v = o.QUICOptions
  26. case C.V2RayTransportTypeGRPC:
  27. v = o.GRPCOptions
  28. case C.V2RayTransportTypeHTTPUpgrade:
  29. v = o.HTTPUpgradeOptions
  30. case "":
  31. return nil, E.New("missing transport type")
  32. default:
  33. return nil, E.New("unknown transport type: " + o.Type)
  34. }
  35. return badjson.MarshallObjects((_V2RayTransportOptions)(o), v)
  36. }
  37. func (o *V2RayTransportOptions) UnmarshalJSON(bytes []byte) error {
  38. err := json.Unmarshal(bytes, (*_V2RayTransportOptions)(o))
  39. if err != nil {
  40. return err
  41. }
  42. var v any
  43. switch o.Type {
  44. case C.V2RayTransportTypeHTTP:
  45. v = &o.HTTPOptions
  46. case C.V2RayTransportTypeWebsocket:
  47. v = &o.WebsocketOptions
  48. case C.V2RayTransportTypeQUIC:
  49. v = &o.QUICOptions
  50. case C.V2RayTransportTypeGRPC:
  51. v = &o.GRPCOptions
  52. case C.V2RayTransportTypeHTTPUpgrade:
  53. v = &o.HTTPUpgradeOptions
  54. default:
  55. return E.New("unknown transport type: " + o.Type)
  56. }
  57. err = badjson.UnmarshallExcluded(bytes, (*_V2RayTransportOptions)(o), v)
  58. if err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. type V2RayHTTPOptions struct {
  64. Host Listable[string] `json:"host,omitempty"`
  65. Path string `json:"path,omitempty"`
  66. Method string `json:"method,omitempty"`
  67. Headers HTTPHeader `json:"headers,omitempty"`
  68. IdleTimeout Duration `json:"idle_timeout,omitempty"`
  69. PingTimeout Duration `json:"ping_timeout,omitempty"`
  70. }
  71. type V2RayWebsocketOptions struct {
  72. Path string `json:"path,omitempty"`
  73. Headers HTTPHeader `json:"headers,omitempty"`
  74. MaxEarlyData uint32 `json:"max_early_data,omitempty"`
  75. EarlyDataHeaderName string `json:"early_data_header_name,omitempty"`
  76. }
  77. type V2RayQUICOptions struct{}
  78. type V2RayGRPCOptions struct {
  79. ServiceName string `json:"service_name,omitempty"`
  80. IdleTimeout Duration `json:"idle_timeout,omitempty"`
  81. PingTimeout Duration `json:"ping_timeout,omitempty"`
  82. PermitWithoutStream bool `json:"permit_without_stream,omitempty"`
  83. ForceLite bool `json:"-"` // for test
  84. }
  85. type V2RayHTTPUpgradeOptions struct {
  86. Host string `json:"host,omitempty"`
  87. Path string `json:"path,omitempty"`
  88. Headers HTTPHeader `json:"headers,omitempty"`
  89. }