connection.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package websocket
  2. import (
  3. "io"
  4. "net"
  5. "time"
  6. "v2ray.com/core/common/errors"
  7. )
  8. var (
  9. ErrInvalidConn = errors.New("Invalid Connection.")
  10. )
  11. type ConnectionManager interface {
  12. Recycle(string, *wsconn)
  13. }
  14. type Connection struct {
  15. dest string
  16. conn *wsconn
  17. listener ConnectionManager
  18. reusable bool
  19. config *Config
  20. }
  21. func NewConnection(dest string, conn *wsconn, manager ConnectionManager, config *Config) *Connection {
  22. return &Connection{
  23. dest: dest,
  24. conn: conn,
  25. listener: manager,
  26. reusable: config.ConnectionReuse.IsEnabled(),
  27. config: config,
  28. }
  29. }
  30. func (v *Connection) Read(b []byte) (int, error) {
  31. if v == nil || v.conn == nil {
  32. return 0, io.EOF
  33. }
  34. return v.conn.Read(b)
  35. }
  36. func (v *Connection) Write(b []byte) (int, error) {
  37. if v == nil || v.conn == nil {
  38. return 0, io.ErrClosedPipe
  39. }
  40. return v.conn.Write(b)
  41. }
  42. func (v *Connection) Close() error {
  43. if v == nil || v.conn == nil {
  44. return io.ErrClosedPipe
  45. }
  46. if v.Reusable() {
  47. v.listener.Recycle(v.dest, v.conn)
  48. return nil
  49. }
  50. err := v.conn.Close()
  51. v.conn = nil
  52. return err
  53. }
  54. func (v *Connection) LocalAddr() net.Addr {
  55. return v.conn.LocalAddr()
  56. }
  57. func (v *Connection) RemoteAddr() net.Addr {
  58. return v.conn.RemoteAddr()
  59. }
  60. func (v *Connection) SetDeadline(t time.Time) error {
  61. return v.conn.SetDeadline(t)
  62. }
  63. func (v *Connection) SetReadDeadline(t time.Time) error {
  64. return v.conn.SetReadDeadline(t)
  65. }
  66. func (v *Connection) SetWriteDeadline(t time.Time) error {
  67. return v.conn.SetWriteDeadline(t)
  68. }
  69. func (v *Connection) SetReusable(reusable bool) {
  70. if !v.config.ConnectionReuse.IsEnabled() {
  71. return
  72. }
  73. v.reusable = reusable
  74. }
  75. func (v *Connection) Reusable() bool {
  76. return v.reusable
  77. }
  78. func (v *Connection) SysFd() (int, error) {
  79. return getSysFd(v.conn)
  80. }
  81. func getSysFd(conn net.Conn) (int, error) {
  82. return 0, ErrInvalidConn
  83. }