Skip to content

Commit d9c7467

Browse files
Merge pull request #2973 from lucas-clemente/publicize-varint
publicize QUIC varint reading and writing
2 parents 5e7fb50 + f922688 commit d9c7467

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+372
-339
lines changed

framer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55

66
"github.com/lucas-clemente/quic-go/internal/ackhandler"
77
"github.com/lucas-clemente/quic-go/internal/protocol"
8-
"github.com/lucas-clemente/quic-go/internal/utils"
98
"github.com/lucas-clemente/quic-go/internal/wire"
9+
"github.com/lucas-clemente/quic-go/quicvarint"
1010
)
1111

1212
type framer interface {
@@ -114,7 +114,7 @@ func (f *framerI) AppendStreamFrames(frames []ackhandler.Frame, maxLen protocol.
114114
// For the last STREAM frame, we'll remove the DataLen field later.
115115
// Therefore, we can pretend to have more bytes available when popping
116116
// the STREAM frame (which will always have the DataLen set).
117-
remainingLen += utils.VarIntLen(uint64(remainingLen))
117+
remainingLen += quicvarint.Len(uint64(remainingLen))
118118
frame, hasMoreData := str.popStreamFrame(remainingLen)
119119
if hasMoreData { // put the stream back in the queue (at the end)
120120
f.streamQueue = append(f.streamQueue, id)

http3/client.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/lucas-clemente/quic-go/internal/protocol"
1616
"github.com/lucas-clemente/quic-go/internal/qtls"
1717
"github.com/lucas-clemente/quic-go/internal/utils"
18+
"github.com/lucas-clemente/quic-go/quicvarint"
1819
"github.com/marten-seemann/qpack"
1920
)
2021

@@ -131,7 +132,7 @@ func (c *client) setupSession() error {
131132
return err
132133
}
133134
buf := &bytes.Buffer{}
134-
utils.WriteVarInt(buf, streamTypeControlStream)
135+
quicvarint.Write(buf, streamTypeControlStream)
135136
// send the SETTINGS frame
136137
(&settingsFrame{Datagram: c.opts.EnableDatagram}).Write(buf)
137138
_, err = str.Write(buf.Bytes())
@@ -147,7 +148,7 @@ func (c *client) handleUnidirectionalStreams() {
147148
}
148149

149150
go func() {
150-
streamType, err := utils.ReadVarInt(&byteReaderImpl{str})
151+
streamType, err := quicvarint.Read(&byteReaderImpl{str})
151152
if err != nil {
152153
c.logger.Debugf("reading stream type on stream %d failed: %s", str.StreamID(), err)
153154
return

http3/client_test.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import (
1212
"time"
1313

1414
"github.com/golang/mock/gomock"
15-
quic "github.com/lucas-clemente/quic-go"
15+
"github.com/lucas-clemente/quic-go"
1616
mockquic "github.com/lucas-clemente/quic-go/internal/mocks/quic"
17+
"github.com/lucas-clemente/quic-go/quicvarint"
1718

1819
"github.com/lucas-clemente/quic-go/internal/protocol"
1920
"github.com/lucas-clemente/quic-go/internal/utils"
@@ -217,7 +218,7 @@ var _ = Describe("Client", func() {
217218

218219
It("parses the SETTINGS frame", func() {
219220
buf := &bytes.Buffer{}
220-
utils.WriteVarInt(buf, streamTypeControlStream)
221+
quicvarint.Write(buf, streamTypeControlStream)
221222
(&settingsFrame{}).Write(buf)
222223
controlStr := mockquic.NewMockStream(mockCtrl)
223224
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
@@ -235,7 +236,7 @@ var _ = Describe("Client", func() {
235236

236237
It("ignores streams other than the control stream", func() {
237238
buf := &bytes.Buffer{}
238-
utils.WriteVarInt(buf, 1337)
239+
quicvarint.Write(buf, 1337)
239240
str := mockquic.NewMockStream(mockCtrl)
240241
str.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
241242
done := make(chan struct{})
@@ -257,7 +258,7 @@ var _ = Describe("Client", func() {
257258

258259
It("errors when the first frame on the control stream is not a SETTINGS frame", func() {
259260
buf := &bytes.Buffer{}
260-
utils.WriteVarInt(buf, streamTypeControlStream)
261+
quicvarint.Write(buf, streamTypeControlStream)
261262
(&dataFrame{}).Write(buf)
262263
controlStr := mockquic.NewMockStream(mockCtrl)
263264
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
@@ -281,7 +282,7 @@ var _ = Describe("Client", func() {
281282

282283
It("errors when parsing the frame on the control stream fails", func() {
283284
buf := &bytes.Buffer{}
284-
utils.WriteVarInt(buf, streamTypeControlStream)
285+
quicvarint.Write(buf, streamTypeControlStream)
285286
b := &bytes.Buffer{}
286287
(&settingsFrame{}).Write(b)
287288
buf.Write(b.Bytes()[:b.Len()-1])
@@ -307,7 +308,7 @@ var _ = Describe("Client", func() {
307308

308309
It("errors when parsing the server opens a push stream", func() {
309310
buf := &bytes.Buffer{}
310-
utils.WriteVarInt(buf, streamTypePushStream)
311+
quicvarint.Write(buf, streamTypePushStream)
311312
controlStr := mockquic.NewMockStream(mockCtrl)
312313
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
313314
sess.EXPECT().AcceptUniStream(gomock.Any()).DoAndReturn(func(context.Context) (quic.ReceiveStream, error) {
@@ -331,7 +332,7 @@ var _ = Describe("Client", func() {
331332
It("errors when the server advertises datagram support (and we enabled support for it)", func() {
332333
client.opts.EnableDatagram = true
333334
buf := &bytes.Buffer{}
334-
utils.WriteVarInt(buf, streamTypeControlStream)
335+
quicvarint.Write(buf, streamTypeControlStream)
335336
(&settingsFrame{Datagram: true}).Write(buf)
336337
controlStr := mockquic.NewMockStream(mockCtrl)
337338
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
@@ -390,7 +391,7 @@ var _ = Describe("Client", func() {
390391
controlStr.EXPECT().Write(gomock.Any()).Do(func(b []byte) {
391392
defer GinkgoRecover()
392393
r := bytes.NewReader(b)
393-
streamType, err := utils.ReadVarInt(r)
394+
streamType, err := quicvarint.Read(r)
394395
Expect(err).ToNot(HaveOccurred())
395396
Expect(streamType).To(BeEquivalentTo(streamTypeControlStream))
396397
close(settingsFrameWritten)

http3/frames.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"io/ioutil"
88

99
"github.com/lucas-clemente/quic-go/internal/protocol"
10-
"github.com/lucas-clemente/quic-go/internal/utils"
10+
"github.com/lucas-clemente/quic-go/quicvarint"
1111
)
1212

1313
type byteReader interface {
@@ -32,11 +32,11 @@ func parseNextFrame(b io.Reader) (frame, error) {
3232
if !ok {
3333
br = &byteReaderImpl{b}
3434
}
35-
t, err := utils.ReadVarInt(br)
35+
t, err := quicvarint.Read(br)
3636
if err != nil {
3737
return nil, err
3838
}
39-
l, err := utils.ReadVarInt(br)
39+
l, err := quicvarint.Read(br)
4040
if err != nil {
4141
return nil, err
4242
}
@@ -72,17 +72,17 @@ type dataFrame struct {
7272
}
7373

7474
func (f *dataFrame) Write(b *bytes.Buffer) {
75-
utils.WriteVarInt(b, 0x0)
76-
utils.WriteVarInt(b, f.Length)
75+
quicvarint.Write(b, 0x0)
76+
quicvarint.Write(b, f.Length)
7777
}
7878

7979
type headersFrame struct {
8080
Length uint64
8181
}
8282

8383
func (f *headersFrame) Write(b *bytes.Buffer) {
84-
utils.WriteVarInt(b, 0x1)
85-
utils.WriteVarInt(b, f.Length)
84+
quicvarint.Write(b, 0x1)
85+
quicvarint.Write(b, f.Length)
8686
}
8787

8888
const settingDatagram = 0x276
@@ -107,11 +107,11 @@ func parseSettingsFrame(r io.Reader, l uint64) (*settingsFrame, error) {
107107
b := bytes.NewReader(buf)
108108
var readDatagram bool
109109
for b.Len() > 0 {
110-
id, err := utils.ReadVarInt(b)
110+
id, err := quicvarint.Read(b)
111111
if err != nil { // should not happen. We allocated the whole frame already.
112112
return nil, err
113113
}
114-
val, err := utils.ReadVarInt(b)
114+
val, err := quicvarint.Read(b)
115115
if err != nil { // should not happen. We allocated the whole frame already.
116116
return nil, err
117117
}
@@ -140,21 +140,21 @@ func parseSettingsFrame(r io.Reader, l uint64) (*settingsFrame, error) {
140140
}
141141

142142
func (f *settingsFrame) Write(b *bytes.Buffer) {
143-
utils.WriteVarInt(b, 0x4)
143+
quicvarint.Write(b, 0x4)
144144
var l protocol.ByteCount
145145
for id, val := range f.other {
146-
l += utils.VarIntLen(id) + utils.VarIntLen(val)
146+
l += quicvarint.Len(id) + quicvarint.Len(val)
147147
}
148148
if f.Datagram {
149-
l += utils.VarIntLen(settingDatagram) + utils.VarIntLen(1)
149+
l += quicvarint.Len(settingDatagram) + quicvarint.Len(1)
150150
}
151-
utils.WriteVarInt(b, uint64(l))
151+
quicvarint.Write(b, uint64(l))
152152
if f.Datagram {
153-
utils.WriteVarInt(b, settingDatagram)
154-
utils.WriteVarInt(b, 1)
153+
quicvarint.Write(b, settingDatagram)
154+
quicvarint.Write(b, 1)
155155
}
156156
for id, val := range f.other {
157-
utils.WriteVarInt(b, id)
158-
utils.WriteVarInt(b, val)
157+
quicvarint.Write(b, id)
158+
quicvarint.Write(b, val)
159159
}
160160
}

http3/frames_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"fmt"
66
"io"
77

8-
"github.com/lucas-clemente/quic-go/internal/utils"
8+
"github.com/lucas-clemente/quic-go/quicvarint"
99

1010
. "github.com/onsi/ginkgo"
1111
. "github.com/onsi/gomega"
@@ -14,7 +14,7 @@ import (
1414
var _ = Describe("Frames", func() {
1515
appendVarInt := func(b []byte, val uint64) []byte {
1616
buf := &bytes.Buffer{}
17-
utils.WriteVarInt(buf, val)
17+
quicvarint.Write(buf, val)
1818
return append(b, buf.Bytes()...)
1919
}
2020

http3/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/lucas-clemente/quic-go/internal/handshake"
2121
"github.com/lucas-clemente/quic-go/internal/protocol"
2222
"github.com/lucas-clemente/quic-go/internal/utils"
23+
"github.com/lucas-clemente/quic-go/quicvarint"
2324
"github.com/marten-seemann/qpack"
2425
)
2526

@@ -235,7 +236,7 @@ func (s *Server) handleConn(sess quic.EarlySession) {
235236
return
236237
}
237238
buf := &bytes.Buffer{}
238-
utils.WriteVarInt(buf, streamTypeControlStream) // stream type
239+
quicvarint.Write(buf, streamTypeControlStream) // stream type
239240
(&settingsFrame{Datagram: s.EnableDatagrams}).Write(buf)
240241
str.Write(buf.Bytes())
241242

@@ -281,7 +282,7 @@ func (s *Server) handleUnidirectionalStreams(sess quic.EarlySession) {
281282
}
282283

283284
go func(str quic.ReceiveStream) {
284-
streamType, err := utils.ReadVarInt(&byteReaderImpl{str})
285+
streamType, err := quicvarint.Read(&byteReaderImpl{str})
285286
if err != nil {
286287
s.logger.Debugf("reading stream type on stream %d failed: %s", str.StreamID(), err)
287288
return

http3/server_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import (
1010
"net/http"
1111
"time"
1212

13-
"github.com/golang/mock/gomock"
1413
"github.com/lucas-clemente/quic-go"
1514
mockquic "github.com/lucas-clemente/quic-go/internal/mocks/quic"
1615
"github.com/lucas-clemente/quic-go/internal/protocol"
1716
"github.com/lucas-clemente/quic-go/internal/testdata"
1817
"github.com/lucas-clemente/quic-go/internal/utils"
18+
"github.com/lucas-clemente/quic-go/quicvarint"
19+
20+
"github.com/golang/mock/gomock"
1921
"github.com/marten-seemann/qpack"
2022

2123
. "github.com/onsi/ginkgo"
@@ -193,7 +195,7 @@ var _ = Describe("Server", func() {
193195

194196
It("parses the SETTINGS frame", func() {
195197
buf := &bytes.Buffer{}
196-
utils.WriteVarInt(buf, streamTypeControlStream)
198+
quicvarint.Write(buf, streamTypeControlStream)
197199
(&settingsFrame{}).Write(buf)
198200
controlStr := mockquic.NewMockStream(mockCtrl)
199201
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
@@ -210,7 +212,7 @@ var _ = Describe("Server", func() {
210212

211213
It("ignores streams other than the control stream", func() {
212214
buf := &bytes.Buffer{}
213-
utils.WriteVarInt(buf, 1337)
215+
quicvarint.Write(buf, 1337)
214216
str := mockquic.NewMockStream(mockCtrl)
215217
str.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
216218
done := make(chan struct{})
@@ -231,7 +233,7 @@ var _ = Describe("Server", func() {
231233

232234
It("errors when the first frame on the control stream is not a SETTINGS frame", func() {
233235
buf := &bytes.Buffer{}
234-
utils.WriteVarInt(buf, streamTypeControlStream)
236+
quicvarint.Write(buf, streamTypeControlStream)
235237
(&dataFrame{}).Write(buf)
236238
controlStr := mockquic.NewMockStream(mockCtrl)
237239
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
@@ -254,7 +256,7 @@ var _ = Describe("Server", func() {
254256

255257
It("errors when parsing the frame on the control stream fails", func() {
256258
buf := &bytes.Buffer{}
257-
utils.WriteVarInt(buf, streamTypeControlStream)
259+
quicvarint.Write(buf, streamTypeControlStream)
258260
b := &bytes.Buffer{}
259261
(&settingsFrame{}).Write(b)
260262
buf.Write(b.Bytes()[:b.Len()-1])
@@ -279,7 +281,7 @@ var _ = Describe("Server", func() {
279281

280282
It("errors when the client opens a push stream", func() {
281283
buf := &bytes.Buffer{}
282-
utils.WriteVarInt(buf, streamTypePushStream)
284+
quicvarint.Write(buf, streamTypePushStream)
283285
(&dataFrame{}).Write(buf)
284286
controlStr := mockquic.NewMockStream(mockCtrl)
285287
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()
@@ -303,7 +305,7 @@ var _ = Describe("Server", func() {
303305
It("errors when the client advertises datagram support (and we enabled support for it)", func() {
304306
s.EnableDatagrams = true
305307
buf := &bytes.Buffer{}
306-
utils.WriteVarInt(buf, streamTypeControlStream)
308+
quicvarint.Write(buf, streamTypeControlStream)
307309
(&settingsFrame{Datagram: true}).Write(buf)
308310
controlStr := mockquic.NewMockStream(mockCtrl)
309311
controlStr.EXPECT().Read(gomock.Any()).DoAndReturn(buf.Read).AnyTimes()

internal/handshake/crypto_setup.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/lucas-clemente/quic-go/internal/utils"
1717
"github.com/lucas-clemente/quic-go/internal/wire"
1818
"github.com/lucas-clemente/quic-go/logging"
19+
"github.com/lucas-clemente/quic-go/quicvarint"
1920
)
2021

2122
// TLS unexpected_message alert
@@ -405,8 +406,8 @@ func (h *cryptoSetup) handleTransportParameters(data []byte) {
405406
// must be called after receiving the transport parameters
406407
func (h *cryptoSetup) marshalDataForSessionState() []byte {
407408
buf := &bytes.Buffer{}
408-
utils.WriteVarInt(buf, clientSessionStateRevision)
409-
utils.WriteVarInt(buf, uint64(h.rttStats.SmoothedRTT().Microseconds()))
409+
quicvarint.Write(buf, clientSessionStateRevision)
410+
quicvarint.Write(buf, uint64(h.rttStats.SmoothedRTT().Microseconds()))
410411
h.peerParams.MarshalForSessionTicket(buf)
411412
return buf.Bytes()
412413
}
@@ -422,14 +423,14 @@ func (h *cryptoSetup) handleDataFromSessionState(data []byte) {
422423

423424
func (h *cryptoSetup) handleDataFromSessionStateImpl(data []byte) (*wire.TransportParameters, error) {
424425
r := bytes.NewReader(data)
425-
ver, err := utils.ReadVarInt(r)
426+
ver, err := quicvarint.Read(r)
426427
if err != nil {
427428
return nil, err
428429
}
429430
if ver != clientSessionStateRevision {
430431
return nil, fmt.Errorf("mismatching version. Got %d, expected %d", ver, clientSessionStateRevision)
431432
}
432-
rtt, err := utils.ReadVarInt(r)
433+
rtt, err := quicvarint.Read(r)
433434
if err != nil {
434435
return nil, err
435436
}

internal/handshake/session_ticket.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"fmt"
77
"time"
88

9-
"github.com/lucas-clemente/quic-go/internal/utils"
109
"github.com/lucas-clemente/quic-go/internal/wire"
10+
"github.com/lucas-clemente/quic-go/quicvarint"
1111
)
1212

1313
const sessionTicketRevision = 2
@@ -19,22 +19,22 @@ type sessionTicket struct {
1919

2020
func (t *sessionTicket) Marshal() []byte {
2121
b := &bytes.Buffer{}
22-
utils.WriteVarInt(b, sessionTicketRevision)
23-
utils.WriteVarInt(b, uint64(t.RTT.Microseconds()))
22+
quicvarint.Write(b, sessionTicketRevision)
23+
quicvarint.Write(b, uint64(t.RTT.Microseconds()))
2424
t.Parameters.MarshalForSessionTicket(b)
2525
return b.Bytes()
2626
}
2727

2828
func (t *sessionTicket) Unmarshal(b []byte) error {
2929
r := bytes.NewReader(b)
30-
rev, err := utils.ReadVarInt(r)
30+
rev, err := quicvarint.Read(r)
3131
if err != nil {
3232
return errors.New("failed to read session ticket revision")
3333
}
3434
if rev != sessionTicketRevision {
3535
return fmt.Errorf("unknown session ticket revision: %d", rev)
3636
}
37-
rtt, err := utils.ReadVarInt(r)
37+
rtt, err := quicvarint.Read(r)
3838
if err != nil {
3939
return errors.New("failed to read RTT")
4040
}

0 commit comments

Comments
 (0)