interop: simplify API of http09.Server (#4651)

Removes the ListenAndServe method in favor of a ServeListener method.
This commit is contained in:
Marten Seemann
2024-08-31 13:13:20 +08:00
committed by GitHub
parent 7c3544ca34
commit 0b32adc145
4 changed files with 37 additions and 67 deletions

View File

@@ -5,17 +5,15 @@ import (
"errors"
"io"
"log"
"net"
"net/http"
"net/url"
"runtime"
"strings"
"sync"
"github.com/quic-go/quic-go"
)
const h09alpn = "hq-interop"
const NextProto = "hq-interop"
type responseWriter struct {
io.Writer
@@ -36,51 +34,14 @@ func (w *responseWriter) WriteHeader(int) {}
// Server is a HTTP/0.9 server listening for QUIC connections.
type Server struct {
*http.Server
ForceRetry bool
QuicConfig *quic.Config
mutex sync.Mutex
listener *quic.EarlyListener
}
// Close closes the server.
func (s *Server) Close() error {
s.mutex.Lock()
defer s.mutex.Unlock()
return s.listener.Close()
}
// ListenAndServe listens and serves HTTP/0.9 over QUIC.
func (s *Server) ListenAndServe() error {
func (s *Server) ServeListener(ln *quic.EarlyListener) error {
if s.Server == nil {
return errors.New("use of http3.Server without http.Server")
}
udpAddr, err := net.ResolveUDPAddr("udp", s.Addr)
if err != nil {
return err
}
conn, err := net.ListenUDP("udp", udpAddr)
if err != nil {
return err
}
tlsConf := s.TLSConfig.Clone()
tlsConf.NextProtos = []string{h09alpn}
tr := quic.Transport{Conn: conn}
if s.ForceRetry {
tr.VerifySourceAddress = func(net.Addr) bool { return true }
}
ln, err := tr.ListenEarly(tlsConf, s.QuicConfig)
if err != nil {
return err
}
s.mutex.Lock()
s.listener = ln
s.mutex.Unlock()
for {
conn, err := ln.Accept(context.Background())
if err != nil {