cmd_tools_fetch_http3.go 935 B

123456789101112131415161718192021222324252627282930313233343536
  1. //go:build with_quic
  2. package main
  3. import (
  4. "context"
  5. "crypto/tls"
  6. "net/http"
  7. "github.com/sagernet/quic-go"
  8. "github.com/sagernet/quic-go/http3"
  9. box "github.com/sagernet/sing-box"
  10. "github.com/sagernet/sing/common/bufio"
  11. M "github.com/sagernet/sing/common/metadata"
  12. N "github.com/sagernet/sing/common/network"
  13. )
  14. func initializeHTTP3Client(instance *box.Box) error {
  15. dialer, err := createDialer(instance, commandToolsFlagOutbound)
  16. if err != nil {
  17. return err
  18. }
  19. http3Client = &http.Client{
  20. Transport: &http3.Transport{
  21. Dial: func(ctx context.Context, addr string, tlsCfg *tls.Config, cfg *quic.Config) (*quic.Conn, error) {
  22. destination := M.ParseSocksaddr(addr)
  23. udpConn, dErr := dialer.DialContext(ctx, N.NetworkUDP, destination)
  24. if dErr != nil {
  25. return nil, dErr
  26. }
  27. return quic.DialEarly(ctx, bufio.NewUnbindPacketConn(udpConn), udpConn.RemoteAddr(), tlsCfg, cfg)
  28. },
  29. },
  30. }
  31. return nil
  32. }