conn.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. if responseWriter, loaded := c.writer.(interface {
  59. SetWriteDeadline(time.Time) error
  60. }); loaded {
  61. return responseWriter.SetWriteDeadline(t)
  62. }
  63. return os.ErrInvalid
  64. }
  65. func (c *HTTPConn) SetReadDeadline(t time.Time) error {
  66. if responseWriter, loaded := c.writer.(interface {
  67. SetReadDeadline(time.Time) error
  68. }); loaded {
  69. return responseWriter.SetReadDeadline(t)
  70. }
  71. return os.ErrInvalid
  72. }
  73. func (c *HTTPConn) SetWriteDeadline(t time.Time) error {
  74. if responseWriter, loaded := c.writer.(interface {
  75. SetWriteDeadline(time.Time) error
  76. }); loaded {
  77. return responseWriter.SetWriteDeadline(t)
  78. }
  79. return os.ErrInvalid
  80. }
  81. type ServerHTTPConn struct {
  82. HTTPConn
  83. flusher http.Flusher
  84. }
  85. func (c *ServerHTTPConn) Write(b []byte) (n int, err error) {
  86. n, err = c.writer.Write(b)
  87. if err == nil {
  88. c.flusher.Flush()
  89. }
  90. return
  91. }