conn.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package v2rayhttp
  2. import (
  3. "io"
  4. "net"
  5. "net/http"
  6. "os"
  7. "time"
  8. "github.com/sagernet/sing-box/common/baderror"
  9. "github.com/sagernet/sing/common"
  10. )
  11. type HTTPConn struct {
  12. reader io.Reader
  13. writer io.Writer
  14. create chan struct{}
  15. err error
  16. }
  17. func newHTTPConn(reader io.Reader, writer io.Writer) HTTPConn {
  18. return HTTPConn{
  19. reader: reader,
  20. writer: writer,
  21. }
  22. }
  23. func newLateHTTPConn(writer io.Writer) *HTTPConn {
  24. return &HTTPConn{
  25. create: make(chan struct{}),
  26. writer: writer,
  27. }
  28. }
  29. func (c *HTTPConn) setup(reader io.Reader, err error) {
  30. c.reader = reader
  31. c.err = err
  32. close(c.create)
  33. }
  34. func (c *HTTPConn) Read(b []byte) (n int, err error) {
  35. if c.reader == nil {
  36. <-c.create
  37. if c.err != nil {
  38. return 0, c.err
  39. }
  40. }
  41. n, err = c.reader.Read(b)
  42. return n, baderror.WrapH2(err)
  43. }
  44. func (c *HTTPConn) Write(b []byte) (n int, err error) {
  45. n, err = c.writer.Write(b)
  46. return n, baderror.WrapH2(err)
  47. }
  48. func (c *HTTPConn) Close() error {
  49. return common.Close(c.reader, c.writer)
  50. }
  51. func (c *HTTPConn) LocalAddr() net.Addr {
  52. return nil
  53. }
  54. func (c *HTTPConn) RemoteAddr() net.Addr {
  55. return nil
  56. }
  57. func (c *HTTPConn) SetDeadline(t time.Time) error {
  58. responseWriter, loaded := c.writer.(interface {
  59. SetWriteDeadline(time.Time) error
  60. })
  61. if !loaded {
  62. return os.ErrInvalid
  63. }
  64. return responseWriter.SetWriteDeadline(t)
  65. }
  66. func (c *HTTPConn) SetReadDeadline(t time.Time) error {
  67. responseWriter, loaded := c.writer.(interface {
  68. SetReadDeadline(time.Time) error
  69. })
  70. if !loaded {
  71. return os.ErrInvalid
  72. }
  73. return responseWriter.SetReadDeadline(t)
  74. }
  75. func (c *HTTPConn) SetWriteDeadline(t time.Time) error {
  76. responseWriter, loaded := c.writer.(interface {
  77. SetWriteDeadline(time.Time) error
  78. })
  79. if !loaded {
  80. return os.ErrInvalid
  81. }
  82. return responseWriter.SetWriteDeadline(t)
  83. }
  84. type ServerHTTPConn struct {
  85. HTTPConn
  86. flusher http.Flusher
  87. }
  88. func (c *ServerHTTPConn) Write(b []byte) (n int, err error) {
  89. n, err = c.writer.Write(b)
  90. if err == nil {
  91. c.flusher.Flush()
  92. }
  93. return
  94. }