forked from quic-go/quic-go
parse and write the frame type field in the CONNECTION_CLOSE frame
This commit is contained in:
@@ -13,6 +13,7 @@ import (
|
|||||||
type ConnectionCloseFrame struct {
|
type ConnectionCloseFrame struct {
|
||||||
IsApplicationError bool
|
IsApplicationError bool
|
||||||
ErrorCode qerr.ErrorCode
|
ErrorCode qerr.ErrorCode
|
||||||
|
FrameType uint64
|
||||||
ReasonPhrase string
|
ReasonPhrase string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,9 +31,11 @@ func parseConnectionCloseFrame(r *bytes.Reader, version protocol.VersionNumber)
|
|||||||
f.ErrorCode = qerr.ErrorCode(ec)
|
f.ErrorCode = qerr.ErrorCode(ec)
|
||||||
// read the Frame Type, if this is not an application error
|
// read the Frame Type, if this is not an application error
|
||||||
if !f.IsApplicationError {
|
if !f.IsApplicationError {
|
||||||
if _, err := utils.ReadVarInt(r); err != nil {
|
ft, err := utils.ReadVarInt(r)
|
||||||
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
f.FrameType = ft
|
||||||
}
|
}
|
||||||
var reasonPhraseLen uint64
|
var reasonPhraseLen uint64
|
||||||
reasonPhraseLen, err = utils.ReadVarInt(r)
|
reasonPhraseLen, err = utils.ReadVarInt(r)
|
||||||
@@ -73,7 +76,7 @@ func (f *ConnectionCloseFrame) Write(b *bytes.Buffer, version protocol.VersionNu
|
|||||||
|
|
||||||
utils.WriteVarInt(b, uint64(f.ErrorCode))
|
utils.WriteVarInt(b, uint64(f.ErrorCode))
|
||||||
if !f.IsApplicationError {
|
if !f.IsApplicationError {
|
||||||
utils.WriteVarInt(b, 0)
|
utils.WriteVarInt(b, f.FrameType)
|
||||||
}
|
}
|
||||||
utils.WriteVarInt(b, uint64(len(f.ReasonPhrase)))
|
utils.WriteVarInt(b, uint64(len(f.ReasonPhrase)))
|
||||||
b.WriteString(f.ReasonPhrase)
|
b.WriteString(f.ReasonPhrase)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ var _ = Describe("CONNECTION_CLOSE Frame", func() {
|
|||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(frame.IsApplicationError).To(BeFalse())
|
Expect(frame.IsApplicationError).To(BeFalse())
|
||||||
Expect(frame.ErrorCode).To(Equal(qerr.ErrorCode(0x19)))
|
Expect(frame.ErrorCode).To(Equal(qerr.ErrorCode(0x19)))
|
||||||
|
Expect(frame.FrameType).To(Equal(uint64(0x1337)))
|
||||||
Expect(frame.ReasonPhrase).To(Equal(reason))
|
Expect(frame.ReasonPhrase).To(Equal(reason))
|
||||||
Expect(b.Len()).To(BeZero())
|
Expect(b.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
@@ -87,12 +88,13 @@ var _ = Describe("CONNECTION_CLOSE Frame", func() {
|
|||||||
b := &bytes.Buffer{}
|
b := &bytes.Buffer{}
|
||||||
frame := &ConnectionCloseFrame{
|
frame := &ConnectionCloseFrame{
|
||||||
ErrorCode: 0xbeef,
|
ErrorCode: 0xbeef,
|
||||||
|
FrameType: 0x12345,
|
||||||
}
|
}
|
||||||
Expect(frame.Write(b, versionIETFFrames)).To(Succeed())
|
Expect(frame.Write(b, versionIETFFrames)).To(Succeed())
|
||||||
expected := []byte{0x1c}
|
expected := []byte{0x1c}
|
||||||
expected = append(expected, encodeVarInt(0xbeef)...)
|
expected = append(expected, encodeVarInt(0xbeef)...)
|
||||||
expected = append(expected, encodeVarInt(0)...) // frame type
|
expected = append(expected, encodeVarInt(0x12345)...) // frame type
|
||||||
expected = append(expected, encodeVarInt(0)...) // reason phrase length
|
expected = append(expected, encodeVarInt(0)...) // reason phrase length
|
||||||
Expect(b.Bytes()).To(Equal(expected))
|
Expect(b.Bytes()).To(Equal(expected))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user