tfo.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package dialer
  2. import (
  3. "context"
  4. "io"
  5. "net"
  6. "time"
  7. )
  8. type tfoConn struct {
  9. net.Conn
  10. closed bool
  11. dialed chan bool
  12. cancel context.CancelFunc
  13. ctx context.Context
  14. dialFn func(ctx context.Context, earlyData []byte) (net.Conn, error)
  15. }
  16. func (c *tfoConn) Dial(earlyData []byte) (err error) {
  17. conn, err := c.dialFn(c.ctx, earlyData)
  18. if err != nil {
  19. return
  20. }
  21. c.Conn = conn
  22. c.dialed <- true
  23. return err
  24. }
  25. func (c *tfoConn) Read(b []byte) (n int, err error) {
  26. if c.closed {
  27. return 0, io.ErrClosedPipe
  28. }
  29. if c.Conn == nil {
  30. select {
  31. case <-c.ctx.Done():
  32. return 0, io.ErrUnexpectedEOF
  33. case <-c.dialed:
  34. }
  35. }
  36. return c.Conn.Read(b)
  37. }
  38. func (c *tfoConn) Write(b []byte) (n int, err error) {
  39. if c.closed {
  40. return 0, io.ErrClosedPipe
  41. }
  42. if c.Conn == nil {
  43. if err := c.Dial(b); err != nil {
  44. return 0, err
  45. }
  46. return len(b), nil
  47. }
  48. return c.Conn.Write(b)
  49. }
  50. func (c *tfoConn) Close() error {
  51. c.closed = true
  52. c.cancel()
  53. if c.Conn == nil {
  54. return nil
  55. }
  56. return c.Conn.Close()
  57. }
  58. func (c *tfoConn) LocalAddr() net.Addr {
  59. if c.Conn == nil {
  60. return &net.TCPAddr{}
  61. }
  62. return c.Conn.LocalAddr()
  63. }
  64. func (c *tfoConn) RemoteAddr() net.Addr {
  65. if c.Conn == nil {
  66. return &net.TCPAddr{}
  67. }
  68. return c.Conn.RemoteAddr()
  69. }
  70. func (c *tfoConn) SetDeadline(t time.Time) error {
  71. if err := c.SetReadDeadline(t); err != nil {
  72. return err
  73. }
  74. return c.SetWriteDeadline(t)
  75. }
  76. func (c *tfoConn) SetReadDeadline(t time.Time) error {
  77. if c.Conn == nil {
  78. return nil
  79. }
  80. return c.Conn.SetReadDeadline(t)
  81. }
  82. func (c *tfoConn) SetWriteDeadline(t time.Time) error {
  83. if c.Conn == nil {
  84. return nil
  85. }
  86. return c.Conn.SetWriteDeadline(t)
  87. }
  88. func (c *tfoConn) Upstream() any {
  89. if c.Conn == nil { // ensure return a nil interface not an interface with nil value
  90. return nil
  91. }
  92. return c.Conn
  93. }
  94. func (c *tfoConn) NeedAdditionalReadDeadline() bool {
  95. return c.Conn == nil
  96. }
  97. func (c *tfoConn) NeedHandshake() bool {
  98. return c.Conn == nil
  99. }
  100. func (c *tfoConn) ReaderReplaceable() bool {
  101. return c.Conn != nil
  102. }
  103. func (c *tfoConn) WriterReplaceable() bool {
  104. return c.Conn != nil
  105. }