package main import ( "context" "fmt" "log" "net/http" "github.com/quic-go/quic-go/http3" "github.com/quic-go/webtransport-go" ) func main() { // 1. Создаем WebTransport Server wt := &webtransport.Server{ CheckOrigin: func(r *http.Request) bool { return true }, } mux := http.NewServeMux() mux.HandleFunc("/chat", func(w http.ResponseWriter, r *http.Request) { // 2. Апгрейд соединения до WebTransport session, err := wt.Upgrade(w, r) if err != nil { log.Printf("Upgrade error: %v", err) return } go handleChatSession(session) }) // 3. Настройка HTTP/3 сервера // В современных версиях quic-go/http3 достаточно передать Handler, // который внутри вызывает wt.Upgrade server := http3.Server{ Addr: ":8080", Handler: mux, } fmt.Println("WebTransport (HTTP/3) Server started on :8080") // 4. Запуск с TLS (обязательно для HTTP/3) // Для теста в Swarm используйте свои cert.pem и key.pem err := server.ListenAndServeTLS("qgo.quizer.space.pem", "qgo.quizer.space-key.pem") if err != nil { log.Fatal(err) } } func handleChatSession(session *webtransport.Session) { for { stream, err := session.AcceptStream(context.Background()) if err != nil { return } go func(s *webtransport.Stream) { defer s.Close() buf := make([]byte, 1024) n, _ := s.Read(buf) fmt.Printf("Message: %s\n", string(buf[:n])) s.Write([]byte("Server: OK")) }(stream) } }