ech_quic.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //go:build with_quic && with_ech
  2. package tls
  3. import (
  4. "context"
  5. "net"
  6. "net/http"
  7. "github.com/sagernet/cloudflare-tls"
  8. "github.com/sagernet/quic-go/ech"
  9. "github.com/sagernet/quic-go/http3_ech"
  10. "github.com/sagernet/sing-quic"
  11. M "github.com/sagernet/sing/common/metadata"
  12. )
  13. var (
  14. _ qtls.Config = (*echClientConfig)(nil)
  15. _ qtls.ServerConfig = (*echServerConfig)(nil)
  16. )
  17. func (c *echClientConfig) Dial(ctx context.Context, conn net.PacketConn, addr net.Addr, config *quic.Config) (quic.Connection, error) {
  18. return quic.Dial(ctx, conn, addr, c.config, config)
  19. }
  20. func (c *echClientConfig) DialEarly(ctx context.Context, conn net.PacketConn, addr net.Addr, config *quic.Config) (quic.EarlyConnection, error) {
  21. return quic.DialEarly(ctx, conn, addr, c.config, config)
  22. }
  23. func (c *echClientConfig) CreateTransport(conn net.PacketConn, quicConnPtr *quic.EarlyConnection, serverAddr M.Socksaddr, quicConfig *quic.Config, enableDatagrams bool) http.RoundTripper {
  24. return &http3.RoundTripper{
  25. TLSClientConfig: c.config,
  26. QuicConfig: quicConfig,
  27. EnableDatagrams: enableDatagrams,
  28. Dial: func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error) {
  29. quicConn, err := quic.DialEarly(ctx, conn, serverAddr.UDPAddr(), tlsCfg, cfg)
  30. if err != nil {
  31. return nil, err
  32. }
  33. *quicConnPtr = quicConn
  34. return quicConn, nil
  35. },
  36. }
  37. }
  38. func (c *echServerConfig) Listen(conn net.PacketConn, config *quic.Config) (qtls.Listener, error) {
  39. return quic.Listen(conn, c.config, config)
  40. }
  41. func (c *echServerConfig) ListenEarly(conn net.PacketConn, config *quic.Config) (qtls.EarlyListener, error) {
  42. return quic.ListenEarly(conn, c.config, config)
  43. }
  44. func (c *echServerConfig) ConfigureHTTP3() {
  45. http3.ConfigureTLSConfig(c.config)
  46. }