forked from quic-go/quic-go
split large StreamFrames into multiple smaller ones before sending
This commit is contained in:
40
session.go
40
session.go
@@ -224,6 +224,40 @@ func (s *Session) handleRstStreamFrame(r *bytes.Reader) error {
|
|||||||
|
|
||||||
// SendFrames sends a number of frames to the client
|
// SendFrames sends a number of frames to the client
|
||||||
func (s *Session) SendFrames(frames []frames.Frame) error {
|
func (s *Session) SendFrames(frames []frames.Frame) error {
|
||||||
|
for _, f := range frames {
|
||||||
|
err := s.SendFrame(f)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendFrame sends a frame to the client
|
||||||
|
func (s *Session) SendFrame(frame frames.Frame) error {
|
||||||
|
streamframe, ok := frame.(*frames.StreamFrame)
|
||||||
|
if ok {
|
||||||
|
maxlength := 1000
|
||||||
|
if len(streamframe.Data) > maxlength {
|
||||||
|
frame1 := &frames.StreamFrame{
|
||||||
|
StreamID: streamframe.StreamID,
|
||||||
|
Offset: streamframe.Offset,
|
||||||
|
Data: streamframe.Data[:maxlength],
|
||||||
|
}
|
||||||
|
frame2 := &frames.StreamFrame{
|
||||||
|
StreamID: streamframe.StreamID,
|
||||||
|
Offset: streamframe.Offset + uint64(maxlength),
|
||||||
|
Data: streamframe.Data[maxlength:],
|
||||||
|
FinBit: streamframe.FinBit,
|
||||||
|
}
|
||||||
|
err := s.SendFrame(frame1)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return s.SendFrame(frame2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var framesData bytes.Buffer
|
var framesData bytes.Buffer
|
||||||
entropyBit, err := utils.RandomBit()
|
entropyBit, err := utils.RandomBit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -235,10 +269,8 @@ func (s *Session) SendFrames(frames []frames.Frame) error {
|
|||||||
framesData.WriteByte(0)
|
framesData.WriteByte(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, f := range frames {
|
if err := frame.Write(&framesData); err != nil {
|
||||||
if err := f.Write(&framesData); err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s.lastSentPacketNumber++
|
s.lastSentPacketNumber++
|
||||||
|
|||||||
Reference in New Issue
Block a user