add files
This commit is contained in:
20
go.mod
Normal file
20
go.mod
Normal file
@@ -0,0 +1,20 @@
|
||||
module qgo
|
||||
|
||||
go 1.25.0
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/dunglas/httpsfv v1.1.0 // indirect
|
||||
github.com/okdaichi/gomoqt v0.10.7 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/quic-go/qpack v0.6.0 // indirect
|
||||
github.com/quic-go/quic-go v0.59.0 // indirect
|
||||
github.com/quic-go/webtransport-go v0.10.0 // indirect
|
||||
github.com/stretchr/objx v0.5.3 // indirect
|
||||
github.com/stretchr/testify v1.11.1 // indirect
|
||||
golang.org/x/crypto v0.46.0 // indirect
|
||||
golang.org/x/net v0.48.0 // indirect
|
||||
golang.org/x/sys v0.39.0 // indirect
|
||||
golang.org/x/text v0.32.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
29
go.sum
Normal file
29
go.sum
Normal file
@@ -0,0 +1,29 @@
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dunglas/httpsfv v1.1.0 h1:Jw76nAyKWKZKFrpMMcL76y35tOpYHqQPzHQiwDvpe54=
|
||||
github.com/dunglas/httpsfv v1.1.0/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
|
||||
github.com/okdaichi/gomoqt v0.10.7 h1:+2fEG8BgBkPPvUorwpaWd9k4IZrtUx+Nr4EDuz8BpYc=
|
||||
github.com/okdaichi/gomoqt v0.10.7/go.mod h1:a85xgBn+vYbsWTn+cH7YQlnmvSE5m8XptIbP1wEz9v0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=
|
||||
github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=
|
||||
github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=
|
||||
github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=
|
||||
github.com/quic-go/webtransport-go v0.10.0 h1:LqXXPOXuETY5Xe8ITdGisBzTYmUOy5eSj+9n4hLTjHI=
|
||||
github.com/quic-go/webtransport-go v0.10.0/go.mod h1:LeGIXr5BQKE3UsynwVBeQrU1TPrbh73MGoC6jd+V7ow=
|
||||
github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
|
||||
github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU=
|
||||
golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0=
|
||||
golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
|
||||
golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
|
||||
golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
|
||||
golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
|
||||
golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
28
localhost+3-key.pem
Normal file
28
localhost+3-key.pem
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC3WrjpsflA1UTA
|
||||
ieT/me0rHuMfRw/K5GVRUSAhaotthGcO3DfYRpGwbNdmvDl74B093hjdFw+iQpuC
|
||||
4QC5zoehre1QZ5dbnGQ8icK1qc733mSClfLmzpkweogRpRDzdzMmNb2qSN5YINLR
|
||||
DTNL3T8OWeLgwzm1ExebUvuQmKDw50T0qIWiFfjOUT5uwpop1Yez4AFkVPLFqE+X
|
||||
RZqrZKzK9mWxvTvV4bVNh6Ocwq2/xcvNv+ClvnX7F02GV2E7Edxkyoxv7dmhLHx8
|
||||
GdmoKGuW9b/9RpWICW/3BzKu71vsAUYwoYxFgWhEHHSYAcSRAyjaYJbFEhOd5qFY
|
||||
77Z82i+XAgMBAAECggEBAJJw9BU6XyAn9cRtnieDUghJoA7gG73pkv5Sc/4ccYWj
|
||||
5QfaXQPwwPWOyK82EBdfFRvPoj4a6BKpbjkm6gR87pj0KAE664lwrCIpyQh8umAA
|
||||
EHi3uIwdX/53Luwg0RwTDRgsffJeRq9Ob/Ilv92MtIsKwYjQg+uadxVIPsHrFUex
|
||||
pCjHI2RupGLd+qQ/7dqZDgVnzSjfwxXdw64NdRYeP6IXkkuHxTLyTjqR4qMIcs/A
|
||||
B/wWA2bfch+aQmzmZ+H2rS6fcvP0COr0F36ZO6T9qS/QFjrTxHD3cpT2qdPcA5VG
|
||||
3RBsmx7+j/DuEjUV/Cc/GKPVjtO/VOUL2JzjkXQtkiECgYEA5OGMgUhpO6e7H9ZP
|
||||
OGORt+gw/hnnaM3OsoRYJvyTcC0XXnmZfFf1tW76Rd9zawVXN9cHNlC+GCAQC/d+
|
||||
Xk0llhAP3tT+rh5TVc+s/7rL7a9kLRevekbjGUon8ZpTjuso7iqP3UpbDAh2grrS
|
||||
k2S06eSJo2CaIfxyvSxEnzmmrecCgYEAzRRAn7lOAnD6lEv5oSMm1yJu0/G/fBmB
|
||||
JpSDkeaB5jB8skoueZL78VRd1NEMbGvmn9aMsIx/jqVokEoh70B3qErlRPqZQ26i
|
||||
a685XU2e8AUI043JExpRNXMwSAmepSRIIa4xR8lqq66RUw20h3wtJTwmKL/w0Tem
|
||||
o9yOTUXlWtECgYBwlZXUnjbNVlNQdM2hEjFCgl9fDoTq45mR7FGkU8d+fV+qZCwg
|
||||
ou/FIGLRbfnLIeRmHkp46Dyph1P9Xu91GYOsjhgQZzsjkN0zL6WMYWkgcI7ZM3Zo
|
||||
smfRL834JQ6HFZubk6oSkxm4EI2i/pzITdhD2NvvVnxazV/vN9BFdklL7wKBgQCc
|
||||
MQKPI9jwLxAKBltXiKg6TfVO4t5OLDabJZ2Xb5IbuW4fdDQ1T+cnBHR6c8Uchomd
|
||||
zxBUHo3AHOaojm2OBPGdcX1wrdQw8YAut8Pe9hFJCOySA3jTXcXgCZ0KIJl9eUae
|
||||
sEbEP/lITKpOMS//yGmx5D/D5XwKPHJkdsTCwatPIQKBgQDBDGmOUhpko0KiuFQU
|
||||
x1behNVqzXEGduXwurorNRCW0v3oHrspgPWzQ0q6in9I9+R2Vww5rlFJAJKeOnG6
|
||||
HTbXMtvrSRu4ySPhJbmHpmmXHBSHjO4w/QZ46aWVgK6a19sXMeVgcrwgEiFkQIgi
|
||||
+F2EKAjDGB8SuVr4u5y35pk7zA==
|
||||
-----END PRIVATE KEY-----
|
||||
26
localhost+3.pem
Normal file
26
localhost+3.pem
Normal file
@@ -0,0 +1,26 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEVTCCAr2gAwIBAgIRANPwHULQ9FFqKkR2fglBngowDQYJKoZIhvcNAQELBQAw
|
||||
dTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSUwIwYDVQQLDBxSRVhc
|
||||
c21pbGVyZXhAUmV4IChTbWlsZSBSZXgpMSwwKgYDVQQDDCNta2NlcnQgUkVYXHNt
|
||||
aWxlcmV4QFJleCAoU21pbGUgUmV4KTAeFw0yNjAzMDMxNjU0MzBaFw0yODA2MDMx
|
||||
NjU0MzBaMFAxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0aWZpY2F0
|
||||
ZTElMCMGA1UECwwcUkVYXHNtaWxlcmV4QFJleCAoU21pbGUgUmV4KTCCASIwDQYJ
|
||||
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALdauOmx+UDVRMCJ5P+Z7Sse4x9HD8rk
|
||||
ZVFRICFqi22EZw7cN9hGkbBs12a8OXvgHT3eGN0XD6JCm4LhALnOh6Gt7VBnl1uc
|
||||
ZDyJwrWpzvfeZIKV8ubOmTB6iBGlEPN3MyY1vapI3lgg0tENM0vdPw5Z4uDDObUT
|
||||
F5tS+5CYoPDnRPSohaIV+M5RPm7CminVh7PgAWRU8sWoT5dFmqtkrMr2ZbG9O9Xh
|
||||
tU2Ho5zCrb/Fy82/4KW+dfsXTYZXYTsR3GTKjG/t2aEsfHwZ2agoa5b1v/1GlYgJ
|
||||
b/cHMq7vW+wBRjChjEWBaEQcdJgBxJEDKNpglsUSE53moVjvtnzaL5cCAwEAAaOB
|
||||
hDCBgTAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0j
|
||||
BBgwFoAU5b3W0xZSMRVucu6dgemt+ce4/v0wOQYDVR0RBDIwMIIJbG9jYWxob3N0
|
||||
ggtteWFwcC5sb2NhbIcEfwAAAYcQAAAAAAAAAAAAAAAAAAAAATANBgkqhkiG9w0B
|
||||
AQsFAAOCAYEABYZKMJdOiMRN5woQ0BR14eQCxseXdE0IgCIdj3jT4fF8XztzIctf
|
||||
VEynT4UEEtZXoWQDy1WU96xbrrXhwC/NIvdDRULIoIobR22kGDkQxRhTB4MCZrzU
|
||||
utyrOcmbN2L+vvJRNi04cMxti4hOxgEfPhy68zmnvo8Wz04pt7ddSyGnrwe2TKvm
|
||||
Af15X9c4S8iaPBag6+9bTlttu/fAOX8o8vA3wMOXdPo7ELYcDIAbCTgJ1UMyYb2p
|
||||
1jzPJX9A3P3xQNdrgkUjTQxzEXikuIt2oDa6wOYi+v73pwbxw7xyl+2kNOvVbHs0
|
||||
k4faHc28ActaYmUOgdMv+xbGS3aZOi8ZqAhudrTFR+emFUvuHGbl3Z2d7B53GP14
|
||||
pRaL9jTZ3QnqL8m50l8QsxEMdbbZv1MuS5gD02HC++k3TDqblaLUw3RvsFESUhtA
|
||||
PWzmxT9RQ7jHMdUbLL1TSGI8FQ6pDa7756apbEAhFz2wfTiQCrD0gXm39Vzf4DOu
|
||||
LMCvXVF7ZufT
|
||||
-----END CERTIFICATE-----
|
||||
77
main.go
Normal file
77
main.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"log"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
|
||||
"github.com/okdaichi/gomoqt/moqt"
|
||||
"github.com/okdaichi/gomoqt/quic"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 🔐 Загружаем mkcert сертификат
|
||||
cert, err := tls.LoadX509KeyPair("localhost+3.pem", "localhost+3-key.pem")
|
||||
if err != nil {
|
||||
log.Fatalf("failed to load server cert and key: %v", err)
|
||||
}
|
||||
|
||||
tlsConfig := &tls.Config{
|
||||
Certificates: []tls.Certificate{cert},
|
||||
NextProtos: []string{"h3"}, // обязательно для HTTP/3
|
||||
}
|
||||
|
||||
// 🚀 MoQ сервер
|
||||
server := moqt.Server{
|
||||
Addr: ":8080",
|
||||
TLSConfig: tlsConfig,
|
||||
QUICConfig: &quic.Config{
|
||||
Allow0RTT: true,
|
||||
EnableDatagrams: true,
|
||||
},
|
||||
}
|
||||
|
||||
path := "/relay"
|
||||
|
||||
// 🌐 WebTransport endpoint
|
||||
http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
|
||||
slog.Info("Incoming WebTransport request")
|
||||
|
||||
err := server.HandleWebTransport(w, r)
|
||||
if err != nil {
|
||||
slog.Error("WebTransport error", "error", err)
|
||||
}
|
||||
})
|
||||
|
||||
// 📡 MoQ setup handler
|
||||
moqt.HandleFunc(path, func(w moqt.SetupResponseWriter, r *moqt.SetupRequest) {
|
||||
slog.Info("MoQ setup request received")
|
||||
|
||||
sess, err := moqt.Accept(w, r, nil)
|
||||
if err != nil {
|
||||
slog.Error("Failed to accept session", "error", err)
|
||||
return
|
||||
}
|
||||
|
||||
slog.Info("MoQ session established", "remote", sess.RemoteAddr())
|
||||
|
||||
// ⚠️ НЕ блокируем поток!
|
||||
go handleSession(sess)
|
||||
})
|
||||
|
||||
slog.Info("Server starting on https://localhost:8080")
|
||||
|
||||
if err := server.ListenAndServe(); err != nil {
|
||||
slog.Error("Server failed", "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
func handleSession(sess *moqt.Session) {
|
||||
defer sess.Context().Done()
|
||||
|
||||
for {
|
||||
// Ждём закрытия соединения
|
||||
select {}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user