v2ray_transport.go 2.6 KB

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