diff --git a/main.go b/main.go index 553dd8d..1ccca32 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "crypto/tls" "fmt" "log" "net/http" @@ -11,53 +12,85 @@ import ( ) func main() { - // 1. Создаем WebTransport Server + mux := http.NewServeMux() + wt := &webtransport.Server{ - CheckOrigin: func(r *http.Request) bool { return true }, + 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) + log.Println("Upgrade error:", err) return } - go handleChatSession(session) + + log.Println("WebTransport session opened") + + go handleSession(session) }) - // 3. Настройка HTTP/3 сервера - // В современных версиях quic-go/http3 достаточно передать Handler, - // который внутри вызывает wt.Upgrade - server := http3.Server{ - Addr: ":8080", - Handler: mux, + tlsConfig := &tls.Config{ + Certificates: make([]tls.Certificate, 1), + NextProtos: []string{ + "h3", + }, } - fmt.Println("WebTransport (HTTP/3) Server started on :8080") + var err error + tlsConfig.Certificates[0], err = tls.LoadX509KeyPair( + "qgo.quizer.space.pem", + "qgo.quizer.space-key.pem", + ) + if err != nil { + log.Fatal(err) + } - // 4. Запуск с TLS (обязательно для HTTP/3) - // Для теста в Swarm используйте свои cert.pem и key.pem - err := server.ListenAndServeTLS("qgo.quizer.space.pem", "qgo.quizer.space-key.pem") + server := http3.Server{ + Addr: ":4443", + Handler: mux, + TLSConfig: tlsConfig, + } + + fmt.Println("WebTransport server running on :4443") + + err = server.ListenAndServe() if err != nil { log.Fatal(err) } } -func handleChatSession(session *webtransport.Session) { +func handleSession(session *webtransport.Session) { + for { + stream, err := session.AcceptStream(context.Background()) if err != nil { + log.Println("session closed:", err) 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) + go handleStream(stream) } } + +func handleStream(stream *webtransport.Stream) { + + defer stream.Close() + + buf := make([]byte, 1024) + + n, err := stream.Read(buf) + if err != nil { + return + } + + msg := string(buf[:n]) + + fmt.Println("Message:", msg) + + stream.Write([]byte("Server: OK")) +}