naive_quic.go 898 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. //go:build with_quic
  2. package inbound
  3. import (
  4. "github.com/sagernet/quic-go"
  5. "github.com/sagernet/quic-go/http3"
  6. "github.com/sagernet/sing-quic"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. )
  9. func (n *Naive) configureHTTP3Listener() error {
  10. err := qtls.ConfigureHTTP3(n.tlsConfig)
  11. if err != nil {
  12. return err
  13. }
  14. udpConn, err := n.ListenUDP()
  15. if err != nil {
  16. return err
  17. }
  18. quicListener, err := qtls.ListenEarly(udpConn, n.tlsConfig, &quic.Config{
  19. MaxIncomingStreams: 1 << 60,
  20. Allow0RTT: true,
  21. })
  22. if err != nil {
  23. udpConn.Close()
  24. return err
  25. }
  26. h3Server := &http3.Server{
  27. Port: int(n.listenOptions.ListenPort),
  28. Handler: n,
  29. }
  30. go func() {
  31. sErr := h3Server.ServeListener(quicListener)
  32. udpConn.Close()
  33. if sErr != nil && !E.IsClosedOrCanceled(sErr) {
  34. n.logger.Error("http3 server serve error: ", sErr)
  35. }
  36. }()
  37. n.h3Server = h3Server
  38. return nil
  39. }