You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

conn.go 1.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package ssh
  2. import (
  3. "context"
  4. "net"
  5. "time"
  6. )
  7. type serverConn struct {
  8. net.Conn
  9. idleTimeout time.Duration
  10. maxDeadline time.Time
  11. closeCanceler context.CancelFunc
  12. }
  13. func (c *serverConn) Write(p []byte) (n int, err error) {
  14. c.updateDeadline()
  15. n, err = c.Conn.Write(p)
  16. if _, isNetErr := err.(net.Error); isNetErr && c.closeCanceler != nil {
  17. c.closeCanceler()
  18. }
  19. return
  20. }
  21. func (c *serverConn) Read(b []byte) (n int, err error) {
  22. c.updateDeadline()
  23. n, err = c.Conn.Read(b)
  24. if _, isNetErr := err.(net.Error); isNetErr && c.closeCanceler != nil {
  25. c.closeCanceler()
  26. }
  27. return
  28. }
  29. func (c *serverConn) Close() (err error) {
  30. err = c.Conn.Close()
  31. if c.closeCanceler != nil {
  32. c.closeCanceler()
  33. }
  34. return
  35. }
  36. func (c *serverConn) updateDeadline() {
  37. switch {
  38. case c.idleTimeout > 0:
  39. idleDeadline := time.Now().Add(c.idleTimeout)
  40. if idleDeadline.Unix() < c.maxDeadline.Unix() || c.maxDeadline.IsZero() {
  41. c.Conn.SetDeadline(idleDeadline)
  42. return
  43. }
  44. fallthrough
  45. default:
  46. c.Conn.SetDeadline(c.maxDeadline)
  47. }
  48. }