config.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package splithttp
  2. import (
  3. "crypto/rand"
  4. "math/big"
  5. "net/http"
  6. "strings"
  7. "github.com/xtls/xray-core/common"
  8. "github.com/xtls/xray-core/transport/internet"
  9. )
  10. func (c *Config) GetNormalizedPath() string {
  11. pathAndQuery := strings.SplitN(c.Path, "?", 2)
  12. path := pathAndQuery[0]
  13. if path == "" || path[0] != '/' {
  14. path = "/" + path
  15. }
  16. if path[len(path)-1] != '/' {
  17. path = path + "/"
  18. }
  19. return path
  20. }
  21. func (c *Config) GetNormalizedQuery() string {
  22. pathAndQuery := strings.SplitN(c.Path, "?", 2)
  23. query := ""
  24. if len(pathAndQuery) > 1 {
  25. query = pathAndQuery[1]
  26. }
  27. if query != "" {
  28. query += "&"
  29. }
  30. paddingLen := c.GetNormalizedXPaddingBytes().rand()
  31. if paddingLen > 0 {
  32. query += "x_padding=" + strings.Repeat("0", int(paddingLen))
  33. }
  34. return query
  35. }
  36. func (c *Config) GetRequestHeader() http.Header {
  37. header := http.Header{}
  38. for k, v := range c.Headers {
  39. header.Add(k, v)
  40. }
  41. return header
  42. }
  43. func (c *Config) WriteResponseHeader(writer http.ResponseWriter) {
  44. // CORS headers for the browser dialer
  45. writer.Header().Set("Access-Control-Allow-Origin", "*")
  46. writer.Header().Set("Access-Control-Allow-Methods", "GET, POST")
  47. paddingLen := c.GetNormalizedXPaddingBytes().rand()
  48. if paddingLen > 0 {
  49. writer.Header().Set("X-Padding", strings.Repeat("0", int(paddingLen)))
  50. }
  51. }
  52. func (c *Config) GetNormalizedXPaddingBytes() RangeConfig {
  53. if c.XPaddingBytes == nil || c.XPaddingBytes.To == 0 {
  54. return RangeConfig{
  55. From: 100,
  56. To: 1000,
  57. }
  58. }
  59. return *c.XPaddingBytes
  60. }
  61. func (c *Config) GetNormalizedScMaxEachPostBytes() RangeConfig {
  62. if c.ScMaxEachPostBytes == nil || c.ScMaxEachPostBytes.To == 0 {
  63. return RangeConfig{
  64. From: 1000000,
  65. To: 1000000,
  66. }
  67. }
  68. return *c.ScMaxEachPostBytes
  69. }
  70. func (c *Config) GetNormalizedScMinPostsIntervalMs() RangeConfig {
  71. if c.ScMinPostsIntervalMs == nil || c.ScMinPostsIntervalMs.To == 0 {
  72. return RangeConfig{
  73. From: 30,
  74. To: 30,
  75. }
  76. }
  77. return *c.ScMinPostsIntervalMs
  78. }
  79. func (c *Config) GetNormalizedScMaxBufferedPosts() int {
  80. if c.ScMaxBufferedPosts == 0 {
  81. return 30
  82. }
  83. return int(c.ScMaxBufferedPosts)
  84. }
  85. func (m *XmuxConfig) GetNormalizedMaxConcurrency() RangeConfig {
  86. if m.MaxConcurrency == nil {
  87. return RangeConfig{
  88. From: 0,
  89. To: 0,
  90. }
  91. }
  92. return *m.MaxConcurrency
  93. }
  94. func (m *XmuxConfig) GetNormalizedMaxConnections() RangeConfig {
  95. if m.MaxConnections == nil {
  96. return RangeConfig{
  97. From: 0,
  98. To: 0,
  99. }
  100. }
  101. return *m.MaxConnections
  102. }
  103. func (m *XmuxConfig) GetNormalizedCMaxReuseTimes() RangeConfig {
  104. if m.CMaxReuseTimes == nil {
  105. return RangeConfig{
  106. From: 0,
  107. To: 0,
  108. }
  109. }
  110. return *m.CMaxReuseTimes
  111. }
  112. func (m *XmuxConfig) GetNormalizedHMaxRequestTimes() RangeConfig {
  113. if m.HMaxRequestTimes == nil {
  114. return RangeConfig{
  115. From: 0,
  116. To: 0,
  117. }
  118. }
  119. return *m.HMaxRequestTimes
  120. }
  121. func (m *XmuxConfig) GetNormalizedHMaxReusableSecs() RangeConfig {
  122. if m.HMaxReusableSecs == nil {
  123. return RangeConfig{
  124. From: 0,
  125. To: 0,
  126. }
  127. }
  128. return *m.HMaxReusableSecs
  129. }
  130. func init() {
  131. common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} {
  132. return new(Config)
  133. }))
  134. }
  135. func (c RangeConfig) rand() int32 {
  136. if c.From == c.To {
  137. return c.From
  138. }
  139. bigInt, _ := rand.Int(rand.Reader, big.NewInt(int64(c.To-c.From)))
  140. return c.From + int32(bigInt.Int64())
  141. }