Skip to content

Commit 7c12f76

Browse files
committed
http3 quic
1 parent 3850e27 commit 7c12f76

File tree

7 files changed

+195
-3
lines changed

7 files changed

+195
-3
lines changed

go.mod

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ require (
2828
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0
2929
github.com/hashicorp/memberlist v0.3.0
3030
github.com/hpcloud/tail v1.0.0
31+
github.com/lucas-clemente/quic-go v0.27.1
3132
github.com/micro/cli v0.2.0
3233
github.com/micro/go-micro v1.18.0
3334
github.com/micro/go-plugins/registry/etcdv3 v0.0.0-20200119172437-4fe21aa238fd
@@ -90,6 +91,7 @@ require (
9091
github.com/eapache/go-resiliency v1.2.0 // indirect
9192
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect
9293
github.com/eapache/queue v1.1.0 // indirect
94+
github.com/francoispqt/gojay v1.2.13 // indirect
9395
github.com/gin-contrib/sse v0.1.0 // indirect
9496
github.com/go-kit/log v0.2.0 // indirect
9597
github.com/go-log/log v0.1.0 // indirect
@@ -103,6 +105,7 @@ require (
103105
github.com/go-playground/universal-translator v0.17.0 // indirect
104106
github.com/go-playground/validator/v10 v10.4.1 // indirect
105107
github.com/go-stack/stack v1.8.0 // indirect
108+
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
106109
github.com/go-zookeeper/zk v1.0.2 // indirect
107110
github.com/gogo/protobuf v1.3.2 // indirect
108111
github.com/golang/snappy v0.0.4 // indirect
@@ -134,11 +137,12 @@ require (
134137
github.com/klauspost/compress v1.13.6 // indirect
135138
github.com/leodido/go-urn v1.2.0 // indirect
136139
github.com/lib/pq v1.10.4 // indirect
137-
github.com/lucas-clemente/quic-go v0.13.1 // indirect
138140
github.com/magiconair/properties v1.8.5 // indirect
139141
github.com/mailru/easyjson v0.7.6 // indirect
140-
github.com/marten-seemann/chacha20 v0.2.0 // indirect
141-
github.com/marten-seemann/qtls v0.4.1 // indirect
142+
github.com/marten-seemann/qpack v0.2.1 // indirect
143+
github.com/marten-seemann/qtls-go1-16 v0.1.5 // indirect
144+
github.com/marten-seemann/qtls-go1-17 v0.1.1 // indirect
145+
github.com/marten-seemann/qtls-go1-18 v0.1.1 // indirect
142146
github.com/mattn/go-isatty v0.0.14 // indirect
143147
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
144148
github.com/micro/mdns v0.3.0 // indirect
@@ -152,6 +156,8 @@ require (
152156
github.com/nats-io/nats.go v1.13.1-0.20211018182449-f2416a8b1483 // indirect
153157
github.com/nats-io/nkeys v0.3.0 // indirect
154158
github.com/nats-io/nuid v1.0.1 // indirect
159+
github.com/nxadm/tail v1.4.8 // indirect
160+
github.com/onsi/ginkgo v1.16.4 // indirect
155161
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
156162
github.com/pelletier/go-toml v1.9.4 // indirect
157163
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
@@ -180,12 +186,14 @@ require (
180186
go.opentelemetry.io/otel/trace v1.0.1 // indirect
181187
go.uber.org/atomic v1.9.0 // indirect
182188
go.uber.org/multierr v1.7.0 // indirect
189+
golang.org/x/mod v0.4.2 // indirect
183190
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect
184191
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
185192
golang.org/x/sys v0.0.0-20211013075003-97ac67df715c // indirect
186193
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
187194
golang.org/x/text v0.3.7 // indirect
188195
golang.org/x/tools v0.1.5 // indirect
196+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
189197
google.golang.org/appengine v1.6.7 // indirect
190198
google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4 // indirect
191199
gopkg.in/fsnotify.v1 v1.4.7 // indirect

quic/ca.pem

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICxjCCAa4CCQCjhcoNf4zvIzANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQKDBpx
3+
dWljIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0yMjA2MDgxNzQxNTBaFw0zMjA2
4+
MDUxNzQxNTBaMCUxIzAhBgNVBAoMGnF1aWMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
5+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvVZ9G0lkSQ+Fir4wW33x
6+
TAos1jdC3TsA1knrsQa7KBHhu2rIuPIzsjwm4frfZW33O2Nz1wI7a1pVe/tPKlI+
7+
APX9aOa26tzKtp3w9AVOC5zyvV1H0oP90pc1/YZeWhxoDj6XoF/gkuFfBvk9blw3
8+
ZOH4eakqEphWuIRpBYWohl340P7R++lDJUyw73MdWkf7HHBPYn8QSoY8b2aJ5fCp
9+
wRmFU3sY15kerEhTK9GobHsAvIdOyebr2AaKHqcsnkmowSfZpf4P2fd1Hv8PHisY
10+
mR9a/ivobSWXFrEAfqPYjjJWhoE7aitF52uiJBmAU86paRtWU6TfXAeaLSQ847Pg
11+
5QIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQC6T1woPAhlFnGX1JnXs9gnaA6c5gVY
12+
M62TnkL9ksBtcItohbkvKiyfceAN+PwmupM+R5/e5KyU3hkZvbzy0jMeIAAJs7ec
13+
iyTVr/98rlyxYMnX6cvMEPQ7+Oc6kRxQmJr/ORJ7QF+uj+D0dyUjoaViu29HWw0Z
14+
5I1tcxytb672FGPBLWj+2b2O4HMHEh25840MhKjuSJ8xWTeLjzy0yWEoamovaLpv
15+
/XdTwoSpOBI5rzURg+LQuyNQO/yveUljBYWjn4utP3ooGIjs64JZnoYkLXH5jThl
16+
spjrq+Y8Q1QSK2DdnUAGw+DXuZRS1MN/ZjtzF6IoAt8BjbRqKux3ITNh
17+
-----END CERTIFICATE-----

quic/cert.pem

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICzzCCAbegAwIBAgIJAL6Vw7VkraKHMA0GCSqGSIb3DQEBCwUAMCUxIzAhBgNV
3+
BAoMGnF1aWMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTIyMDYwODE3NDE1MFoX
4+
DTMyMDYwNTE3NDE1MFowDzENMAsGA1UECgwEcXVpYzCCASIwDQYJKoZIhvcNAQEB
5+
BQADggEPADCCAQoCggEBAMgWz5PvtvL5Izm5AawQKVwW24sZ30Y0PQn0o1zRJSYt
6+
QwwtFBDuSqxfuysQFioBEZAIOQUt8cKllOm+8pehQT50lBfM9CsukYKVDOkmbdLN
7+
65l5Z9MfZptElrk7WtecPylk3l8Tg9Q8VEDby82pkN8P/1UiY5x53NsGuzQFSTqm
8+
n1SiFXq2g1vrAxxIppi73WtrlyePKwmmkUbOza/TF766f8QVleCGBbhzipYnaWfg
9+
EW978l4LI0dMoZcYntVSY3X3Dl1Pgt8gMBKwVlKtDKudQBSPWSkFjnmgMGkftYFi
10+
iW8hzTZ5ZOAYT7QHWLTegzCoTVGY4AaIw+u7/hZPQK0CAwEAAaMYMBYwFAYDVR0R
11+
BA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IBAQCaSrOyPwYyu58BrZ9U
12+
7XPD7Q7qYwAABewcdXB8zwEzusUdKUwOMHsTCsxt6PvYmv+5PClOZkXIPkwdS4bd
13+
DEn2tdcjk+VFYqUZ/Z/LWNOuW5YBdvfgNZURChrKQE3g/oOSCkL1g57IS/IbZ/ow
14+
c7b/LNN/mJ75Jy0zrc4JLUbulIqQ5+lLCnkEacwISAFopWwXCWa67V6AM5T0/tPR
15+
2XteaABGOzTU3XziP+MUp0U7yRkqvTICUObbfVljDpptMMOsp1Hp4+TxQmP7wSMS
16+
EvSGH8RKNsyiA9hD7VlO5l17yw3ChqYh0PL+IVfXU2Xl1mi+W7zFJPs3e7rNN+Ve
17+
5KDI
18+
-----END CERTIFICATE-----

quic/generate_key.sh

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
echo "Generating CA key and certificate:"
6+
openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 \
7+
-keyout ca.key -out ca.pem \
8+
-subj "/O=quic Certificate Authority/"
9+
10+
echo "Generating CSR"
11+
openssl req -out cert.csr -new -newkey rsa:2048 -nodes -keyout priv.key \
12+
-subj "/O=quic/"
13+
14+
echo "Sign certificate:"
15+
openssl x509 -req -sha256 -days 3650 -in cert.csr -out cert.pem \
16+
-CA ca.pem -CAkey ca.key -CAcreateserial \
17+
-extfile <(printf "subjectAltName=DNS:localhost")
18+
19+
# debug output the certificate
20+
openssl x509 -noout -text -in cert.pem
21+
22+
# we don't need the CA key, the serial number and the CSR any more
23+
rm ca.key cert.csr ca.srl
24+

quic/priv.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDIFs+T77by+SM5
3+
uQGsEClcFtuLGd9GND0J9KNc0SUmLUMMLRQQ7kqsX7srEBYqARGQCDkFLfHCpZTp
4+
vvKXoUE+dJQXzPQrLpGClQzpJm3SzeuZeWfTH2abRJa5O1rXnD8pZN5fE4PUPFRA
5+
28vNqZDfD/9VImOcedzbBrs0BUk6pp9UohV6toNb6wMcSKaYu91ra5cnjysJppFG
6+
zs2v0xe+un/EFZXghgW4c4qWJ2ln4BFve/JeCyNHTKGXGJ7VUmN19w5dT4LfIDAS
7+
sFZSrQyrnUAUj1kpBY55oDBpH7WBYolvIc02eWTgGE+0B1i03oMwqE1RmOAGiMPr
8+
u/4WT0CtAgMBAAECggEBAI0WqKBkM9j4nEIjlm5BpyhsZbqcL7hNNY1Dl73nLA7T
9+
c6euUavum3EYv94JpddQkZXCdpKUZxkdsPdx0ZXh+yOTCKoPt0yLtcciWsw8cMxo
10+
r2y1EuToC24I208Z72CBqHgDzFm2ZQrOz4o8cmU+4AyqNx1M9nhr5bP79x0jbROR
11+
Egu7dUBFlwMqtVqU1LqAcaaZsV/fCLgEiyLQ8Iyc5i/+Ne1HJkBOouMXXN5vdOgI
12+
U2/GRvJnJZyYKqDs3Zuk3YYPgHtXrqDJIzR53LmgWK0pD14TxYsWV2DLm/zaJglY
13+
hGEOl8gzUyz51R6jPvntlRHrWwhYjPORqJV0AAA7/PECgYEA9mCSjayK4EVX9oud
14+
u2hAtB73qij2TfC/yD1Plicuqnj13FV+Z91t99NFAGUXiYcH0HiK3wDhTnFo+LZE
15+
ej0PuxHQGzumb4St/PZ5QVJPQlTAet4FsTzOYQKhYpQEewWBrzCI/2utkQDFNdOg
16+
vHmHJY6uAGRw7PWVJh2Cd6hW+JsCgYEAz+dr/lWAFofzgNMtFUAYtYvw97ub5Wl8
17+
YjlcApwto/SThiQWPZe62+ruPD/XECo/9asr5FyIBzQqN6nEWhVJ2lfN1dgSAi18
18+
v0y2+cVrDPwGKPRPW79M5tPYmReSHcTa54fysn/Q4h5nrMlU39Tl9nyMnAM6fTmv
19+
5gDxXkEkjFcCgYEAlfEuH/TLTDRHlW9g3mZTQou6NJ/bTpHfVfEiV4KfHvagwqhx
20+
VqrnOzUjwFrF2VgJhHFoKtHxTPkuZnce87nnsfTkTz6dSy9XaCVkpEGApSDJR72J
21+
f1U/UMD2EPV+SJSQWVtTdQdGSYJLgze5khrwCgZslSaLp1rKm7jH5yTXUVMCgYEA
22+
nnAmhLRz4LfKgips+PzX18LF6IU40SQKfnBoBjUvMvt4UYm+yUGQTXhEBfZA1zjb
23+
dUT1NhquL485fSILWPtQRO0VGBqJ3s77em3kI4SniEWoDB3jPHAVEvPu5PxphfY3
24+
PKsF8bImZav2Jl9oJwwAFE/meB6dvEDyI74kM0hBqhECgYBg+/pKSUKlHhNfR6aa
25+
Nssmpd2mBkgva3xLJtlIjkdr74BoJQHk+DXsbdjoaN5zAgPFOJVgpo3MNKgH+Zx7
26+
v0zFnXao+Z5RuK+RVTlyMwPW+mIeTS7FimdaWxa/4x5XB9O86J4Mu5MpIdiaoz8V
27+
IjFr3vnnhpzSoqa939jLObT7hg==
28+
-----END PRIVATE KEY-----

quic/quic_client.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package main
2+
3+
import (
4+
"crypto/tls"
5+
"crypto/x509"
6+
"fmt"
7+
"io"
8+
"io/ioutil"
9+
"net/http"
10+
"os"
11+
"time"
12+
13+
"github.com/lucas-clemente/quic-go/qlog"
14+
15+
"github.com/lucas-clemente/quic-go/logging"
16+
17+
"github.com/lucas-clemente/quic-go"
18+
19+
"github.com/lucas-clemente/quic-go/http3"
20+
)
21+
22+
func main() {
23+
pool, err := x509.SystemCertPool()
24+
if err != nil {
25+
panic(err)
26+
}
27+
roundTripper := &http3.RoundTripper{
28+
TLSClientConfig: &tls.Config{
29+
RootCAs: pool,
30+
InsecureSkipVerify: true,
31+
KeyLogWriter: os.Stdout,
32+
},
33+
QuicConfig: &quic.Config{
34+
Tracer: qlog.NewTracer(func(p logging.Perspective, connectionID []byte) io.WriteCloser {
35+
36+
return os.Stdout
37+
}),
38+
},
39+
}
40+
defer roundTripper.Close()
41+
client := &http.Client{
42+
Transport: roundTripper,
43+
Timeout: 2 * time.Second,
44+
}
45+
var i = 0
46+
for i < 3 {
47+
i++
48+
res, err := client.Get("https://127.0.0.1:8888/quic")
49+
if err != nil {
50+
panic(err)
51+
}
52+
defer res.Body.Close()
53+
data, err := ioutil.ReadAll(res.Body)
54+
if err != nil {
55+
panic(err)
56+
}
57+
fmt.Println("收到返回值", string(data))
58+
}
59+
60+
}

quic/quic_server.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
7+
"github.com/lucas-clemente/quic-go"
8+
9+
"github.com/lucas-clemente/quic-go/http3"
10+
11+
"github.com/google/uuid"
12+
)
13+
14+
const (
15+
addr = ":8888"
16+
)
17+
18+
func main() {
19+
setUpQuic()
20+
}
21+
22+
func setUpQuic() {
23+
mux := http.NewServeMux()
24+
mux.HandleFunc("/quic", func(w http.ResponseWriter, r *http.Request) {
25+
fmt.Printf("request %+v \n", r.Header)
26+
_, _ = w.Write([]byte(uuid.New().String()))
27+
})
28+
29+
server := http3.Server{
30+
Server: &http.Server{Handler: mux, Addr: addr},
31+
QuicConfig: &quic.Config{},
32+
}
33+
fmt.Println("start http3 quic addr " + addr)
34+
if err := server.ListenAndServeTLS("./cert.pem", "./priv.key"); err != nil {
35+
panic(err)
36+
}
37+
}

0 commit comments

Comments
 (0)