//go:build with_quic

package inbound

import (
	"github.com/sagernet/quic-go"
	"github.com/sagernet/quic-go/http3"
	"github.com/sagernet/sing-quic"
	E "github.com/sagernet/sing/common/exceptions"
)

func (n *Naive) configureHTTP3Listener() error {
	err := qtls.ConfigureHTTP3(n.tlsConfig)
	if err != nil {
		return err
	}

	udpConn, err := n.ListenUDP()
	if err != nil {
		return err
	}

	quicListener, err := qtls.ListenEarly(udpConn, n.tlsConfig, &quic.Config{
		MaxIncomingStreams: 1 << 60,
		Allow0RTT:          true,
	})
	if err != nil {
		udpConn.Close()
		return err
	}

	h3Server := &http3.Server{
		Port:    int(n.listenOptions.ListenPort),
		Handler: n,
	}

	go func() {
		sErr := h3Server.ServeListener(quicListener)
		udpConn.Close()
		if sErr != nil && !E.IsClosedOrCanceled(sErr) {
			n.logger.Error("http3 server serve error: ", sErr)
		}
	}()

	n.h3Server = h3Server
	return nil
}