inbound_init.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package quic
  2. import (
  3. "io"
  4. "net/http"
  5. "github.com/sagernet/quic-go"
  6. "github.com/sagernet/quic-go/http3"
  7. "github.com/sagernet/sing-box/common/listener"
  8. "github.com/sagernet/sing-box/common/tls"
  9. "github.com/sagernet/sing-box/protocol/naive"
  10. "github.com/sagernet/sing-quic"
  11. E "github.com/sagernet/sing/common/exceptions"
  12. "github.com/sagernet/sing/common/logger"
  13. )
  14. func init() {
  15. naive.ConfigureHTTP3ListenerFunc = func(listener *listener.Listener, handler http.Handler, tlsConfig tls.ServerConfig, logger logger.Logger) (io.Closer, error) {
  16. err := qtls.ConfigureHTTP3(tlsConfig)
  17. if err != nil {
  18. return nil, err
  19. }
  20. udpConn, err := listener.ListenUDP()
  21. if err != nil {
  22. return nil, err
  23. }
  24. quicListener, err := qtls.ListenEarly(udpConn, tlsConfig, &quic.Config{
  25. MaxIncomingStreams: 1 << 60,
  26. Allow0RTT: true,
  27. })
  28. if err != nil {
  29. udpConn.Close()
  30. return nil, err
  31. }
  32. h3Server := &http3.Server{
  33. Handler: handler,
  34. }
  35. go func() {
  36. sErr := h3Server.ServeListener(quicListener)
  37. udpConn.Close()
  38. if sErr != nil && !E.IsClosedOrCanceled(sErr) {
  39. logger.Error("http3 server closed: ", sErr)
  40. }
  41. }()
  42. return quicListener, nil
  43. }
  44. }