conn.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package v2rayhttp
  2. import (
  3. "io"
  4. "net"
  5. "net/http"
  6. "os"
  7. "time"
  8. "github.com/sagernet/sing/common"
  9. E "github.com/sagernet/sing/common/exceptions"
  10. )
  11. type HTTPConn struct {
  12. reader io.Reader
  13. writer io.Writer
  14. }
  15. func (c *HTTPConn) Read(b []byte) (n int, err error) {
  16. n, err = c.reader.Read(b)
  17. return n, wrapError(err)
  18. }
  19. func (c *HTTPConn) Write(b []byte) (n int, err error) {
  20. n, err = c.writer.Write(b)
  21. return n, wrapError(err)
  22. }
  23. func (c *HTTPConn) Close() error {
  24. return common.Close(c.reader, c.writer)
  25. }
  26. func (c *HTTPConn) LocalAddr() net.Addr {
  27. return nil
  28. }
  29. func (c *HTTPConn) RemoteAddr() net.Addr {
  30. return nil
  31. }
  32. func (c *HTTPConn) SetDeadline(t time.Time) error {
  33. return os.ErrInvalid
  34. }
  35. func (c *HTTPConn) SetReadDeadline(t time.Time) error {
  36. return os.ErrInvalid
  37. }
  38. func (c *HTTPConn) SetWriteDeadline(t time.Time) error {
  39. return os.ErrInvalid
  40. }
  41. type ServerHTTPConn struct {
  42. HTTPConn
  43. flusher http.Flusher
  44. }
  45. func (c *ServerHTTPConn) Write(b []byte) (n int, err error) {
  46. n, err = c.writer.Write(b)
  47. if err == nil {
  48. c.flusher.Flush()
  49. }
  50. return
  51. }
  52. func wrapError(err error) error {
  53. if E.IsMulti(err, io.ErrUnexpectedEOF) {
  54. return io.EOF
  55. }
  56. return err
  57. }