1
0

http.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package http
  2. //go:generate go run github.com/xtls/xray-core/common/errors/errorgen
  3. import (
  4. "bufio"
  5. "bytes"
  6. "context"
  7. "io"
  8. "net"
  9. "net/http"
  10. "strings"
  11. "time"
  12. "github.com/xtls/xray-core/common"
  13. "github.com/xtls/xray-core/common/buf"
  14. "github.com/xtls/xray-core/common/errors"
  15. )
  16. const (
  17. // CRLF is the line ending in HTTP header
  18. CRLF = "\r\n"
  19. // ENDING is the double line ending between HTTP header and body.
  20. ENDING = CRLF + CRLF
  21. // max length of HTTP header. Safety precaution for DDoS attack.
  22. maxHeaderLength = 8192
  23. )
  24. var (
  25. ErrHeaderToLong = errors.New("Header too long.")
  26. ErrHeaderMisMatch = errors.New("Header Mismatch.")
  27. )
  28. type Reader interface {
  29. Read(io.Reader) (*buf.Buffer, error)
  30. }
  31. type Writer interface {
  32. Write(io.Writer) error
  33. }
  34. type NoOpReader struct{}
  35. func (NoOpReader) Read(io.Reader) (*buf.Buffer, error) {
  36. return nil, nil
  37. }
  38. type NoOpWriter struct{}
  39. func (NoOpWriter) Write(io.Writer) error {
  40. return nil
  41. }
  42. type HeaderReader struct {
  43. req *http.Request
  44. expectedHeader *RequestConfig
  45. }
  46. func (h *HeaderReader) ExpectThisRequest(expectedHeader *RequestConfig) *HeaderReader {
  47. h.expectedHeader = expectedHeader
  48. return h
  49. }
  50. func (h *HeaderReader) Read(reader io.Reader) (*buf.Buffer, error) {
  51. buffer := buf.New()
  52. totalBytes := int32(0)
  53. endingDetected := false
  54. var headerBuf bytes.Buffer
  55. for totalBytes < maxHeaderLength {
  56. _, err := buffer.ReadFrom(reader)
  57. if err != nil {
  58. buffer.Release()
  59. return nil, err
  60. }
  61. if n := bytes.Index(buffer.Bytes(), []byte(ENDING)); n != -1 {
  62. headerBuf.Write(buffer.BytesRange(0, int32(n+len(ENDING))))
  63. buffer.Advance(int32(n + len(ENDING)))
  64. endingDetected = true
  65. break
  66. }
  67. lenEnding := int32(len(ENDING))
  68. if buffer.Len() >= lenEnding {
  69. totalBytes += buffer.Len() - lenEnding
  70. headerBuf.Write(buffer.BytesRange(0, buffer.Len()-lenEnding))
  71. leftover := buffer.BytesFrom(-lenEnding)
  72. buffer.Clear()
  73. copy(buffer.Extend(lenEnding), leftover)
  74. if _, err := readRequest(bufio.NewReader(bytes.NewReader(headerBuf.Bytes()))); err != io.ErrUnexpectedEOF {
  75. return nil, err
  76. }
  77. }
  78. }
  79. if !endingDetected {
  80. buffer.Release()
  81. return nil, ErrHeaderToLong
  82. }
  83. if h.expectedHeader == nil {
  84. if buffer.IsEmpty() {
  85. buffer.Release()
  86. return nil, nil
  87. }
  88. return buffer, nil
  89. }
  90. // Parse the request
  91. if req, err := readRequest(bufio.NewReader(bytes.NewReader(headerBuf.Bytes()))); err != nil {
  92. return nil, err
  93. } else {
  94. h.req = req
  95. }
  96. // Check req
  97. path := h.req.URL.Path
  98. hasThisURI := false
  99. for _, u := range h.expectedHeader.Uri {
  100. if u == path {
  101. hasThisURI = true
  102. }
  103. }
  104. if !hasThisURI {
  105. return nil, ErrHeaderMisMatch
  106. }
  107. if buffer.IsEmpty() {
  108. buffer.Release()
  109. return nil, nil
  110. }
  111. return buffer, nil
  112. }
  113. type HeaderWriter struct {
  114. header *buf.Buffer
  115. }
  116. func NewHeaderWriter(header *buf.Buffer) *HeaderWriter {
  117. return &HeaderWriter{
  118. header: header,
  119. }
  120. }
  121. func (w *HeaderWriter) Write(writer io.Writer) error {
  122. if w.header == nil {
  123. return nil
  124. }
  125. err := buf.WriteAllBytes(writer, w.header.Bytes(), nil)
  126. w.header.Release()
  127. w.header = nil
  128. return err
  129. }
  130. type Conn struct {
  131. net.Conn
  132. readBuffer *buf.Buffer
  133. oneTimeReader Reader
  134. oneTimeWriter Writer
  135. errorWriter Writer
  136. errorMismatchWriter Writer
  137. errorTooLongWriter Writer
  138. errReason error
  139. }
  140. func NewConn(conn net.Conn, reader Reader, writer Writer, errorWriter Writer, errorMismatchWriter Writer, errorTooLongWriter Writer) *Conn {
  141. return &Conn{
  142. Conn: conn,
  143. oneTimeReader: reader,
  144. oneTimeWriter: writer,
  145. errorWriter: errorWriter,
  146. errorMismatchWriter: errorMismatchWriter,
  147. errorTooLongWriter: errorTooLongWriter,
  148. }
  149. }
  150. func (c *Conn) Read(b []byte) (int, error) {
  151. if c.oneTimeReader != nil {
  152. buffer, err := c.oneTimeReader.Read(c.Conn)
  153. if err != nil {
  154. c.errReason = err
  155. return 0, err
  156. }
  157. c.readBuffer = buffer
  158. c.oneTimeReader = nil
  159. }
  160. if !c.readBuffer.IsEmpty() {
  161. nBytes, _ := c.readBuffer.Read(b)
  162. if c.readBuffer.IsEmpty() {
  163. c.readBuffer.Release()
  164. c.readBuffer = nil
  165. }
  166. return nBytes, nil
  167. }
  168. return c.Conn.Read(b)
  169. }
  170. // Write implements io.Writer.
  171. func (c *Conn) Write(b []byte) (int, error) {
  172. if c.oneTimeWriter != nil {
  173. err := c.oneTimeWriter.Write(c.Conn)
  174. c.oneTimeWriter = nil
  175. if err != nil {
  176. return 0, err
  177. }
  178. }
  179. return c.Conn.Write(b)
  180. }
  181. // Close implements net.Conn.Close().
  182. func (c *Conn) Close() error {
  183. if c.oneTimeWriter != nil && c.errorWriter != nil {
  184. // Connection is being closed but header wasn't sent. This means the client request
  185. // is probably not valid. Sending back a server error header in this case.
  186. // Write response based on error reason
  187. switch c.errReason {
  188. case ErrHeaderMisMatch:
  189. c.errorMismatchWriter.Write(c.Conn)
  190. case ErrHeaderToLong:
  191. c.errorTooLongWriter.Write(c.Conn)
  192. default:
  193. c.errorWriter.Write(c.Conn)
  194. }
  195. }
  196. return c.Conn.Close()
  197. }
  198. func formResponseHeader(config *ResponseConfig) *HeaderWriter {
  199. header := buf.New()
  200. common.Must2(header.WriteString(strings.Join([]string{config.GetFullVersion(), config.GetStatusValue().Code, config.GetStatusValue().Reason}, " ")))
  201. common.Must2(header.WriteString(CRLF))
  202. headers := config.PickHeaders()
  203. for _, h := range headers {
  204. common.Must2(header.WriteString(h))
  205. common.Must2(header.WriteString(CRLF))
  206. }
  207. if !config.HasHeader("Date") {
  208. common.Must2(header.WriteString("Date: "))
  209. common.Must2(header.WriteString(time.Now().Format(http.TimeFormat)))
  210. common.Must2(header.WriteString(CRLF))
  211. }
  212. common.Must2(header.WriteString(CRLF))
  213. return &HeaderWriter{
  214. header: header,
  215. }
  216. }
  217. type Authenticator struct {
  218. config *Config
  219. }
  220. func (a Authenticator) GetClientWriter() *HeaderWriter {
  221. header := buf.New()
  222. config := a.config.Request
  223. common.Must2(header.WriteString(strings.Join([]string{config.GetMethodValue(), config.PickURI(), config.GetFullVersion()}, " ")))
  224. common.Must2(header.WriteString(CRLF))
  225. headers := config.PickHeaders()
  226. for _, h := range headers {
  227. common.Must2(header.WriteString(h))
  228. common.Must2(header.WriteString(CRLF))
  229. }
  230. common.Must2(header.WriteString(CRLF))
  231. return &HeaderWriter{
  232. header: header,
  233. }
  234. }
  235. func (a Authenticator) GetServerWriter() *HeaderWriter {
  236. return formResponseHeader(a.config.Response)
  237. }
  238. func (a Authenticator) Client(conn net.Conn) net.Conn {
  239. if a.config.Request == nil && a.config.Response == nil {
  240. return conn
  241. }
  242. var reader Reader = NoOpReader{}
  243. if a.config.Request != nil {
  244. reader = new(HeaderReader)
  245. }
  246. var writer Writer = NoOpWriter{}
  247. if a.config.Response != nil {
  248. writer = a.GetClientWriter()
  249. }
  250. return NewConn(conn, reader, writer, NoOpWriter{}, NoOpWriter{}, NoOpWriter{})
  251. }
  252. func (a Authenticator) Server(conn net.Conn) net.Conn {
  253. if a.config.Request == nil && a.config.Response == nil {
  254. return conn
  255. }
  256. return NewConn(conn, new(HeaderReader).ExpectThisRequest(a.config.Request), a.GetServerWriter(),
  257. formResponseHeader(resp400),
  258. formResponseHeader(resp404),
  259. formResponseHeader(resp400))
  260. }
  261. func NewAuthenticator(ctx context.Context, config *Config) (Authenticator, error) {
  262. return Authenticator{
  263. config: config,
  264. }, nil
  265. }
  266. func init() {
  267. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) {
  268. return NewAuthenticator(ctx, config.(*Config))
  269. }))
  270. }