tls.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package tls
  2. import (
  3. "crypto/tls"
  4. "v2ray.com/core/common/buf"
  5. "v2ray.com/core/common/net"
  6. )
  7. //go:generate errorgen
  8. var (
  9. _ buf.Writer = (*conn)(nil)
  10. )
  11. type conn struct {
  12. *tls.Conn
  13. mergingWriter *buf.BufferedWriter
  14. }
  15. func (c *conn) WriteMultiBuffer(mb buf.MultiBuffer) error {
  16. if c.mergingWriter == nil {
  17. c.mergingWriter = buf.NewBufferedWriter(buf.NewWriter(c.Conn))
  18. }
  19. if err := c.mergingWriter.WriteMultiBuffer(mb); err != nil {
  20. return err
  21. }
  22. return c.mergingWriter.Flush()
  23. }
  24. func (c *conn) HandshakeAddress() net.Address {
  25. if err := c.Handshake(); err != nil {
  26. return nil
  27. }
  28. state := c.Conn.ConnectionState()
  29. if len(state.ServerName) == 0 {
  30. return nil
  31. }
  32. return net.ParseAddress(state.ServerName)
  33. }
  34. // Client initiates a TLS client handshake on the given connection.
  35. func Client(c net.Conn, config *tls.Config) net.Conn {
  36. tlsConn := tls.Client(c, config)
  37. return &conn{Conn: tlsConn}
  38. }
  39. // Server initiates a TLS server handshake on the given connection.
  40. func Server(c net.Conn, config *tls.Config) net.Conn {
  41. tlsConn := tls.Server(c, config)
  42. return &conn{Conn: tlsConn}
  43. }