implement basic flow control

fixes #37
This commit is contained in:
Marten Seemann
2016-05-03 12:07:01 +07:00
parent daf4e4a867
commit f240df6ea5
4 changed files with 161 additions and 16 deletions

View File

@@ -23,7 +23,8 @@ type receivedPacket struct {
}
var (
errRstStreamOnInvalidStream = errors.New("RST_STREAM received for unknown stream")
errRstStreamOnInvalidStream = errors.New("RST_STREAM received for unknown stream")
errWindowUpdateOnInvalidStream = errors.New("WINDOW_UPDATE received for unknown stream")
)
// StreamCallback gets a stream frame and returns a reply frame
@@ -172,6 +173,7 @@ func (s *Session) handlePacket(remoteAddr interface{}, publicHeader *PublicHeade
fmt.Printf("\t<- %#v\n", frame)
case *frames.WindowUpdateFrame:
fmt.Printf("\t<- %#v\n", frame)
err = s.handleWindowUpdateFrame(frame)
case *frames.BlockedFrame:
fmt.Printf("BLOCKED frame received for connection %x stream %d\n", s.connectionID, frame.StreamID)
default:
@@ -215,6 +217,25 @@ func (s *Session) handleStreamFrame(frame *frames.StreamFrame) error {
return nil
}
func (s *Session) handleWindowUpdateFrame(frame *frames.WindowUpdateFrame) error {
if frame.StreamID == 0 {
// TODO: handle connection level WindowUpdateFrames
// return errors.New("Connection level flow control not yet implemented")
return nil
}
s.streamsMutex.RLock()
stream, ok := s.streams[frame.StreamID]
s.streamsMutex.RUnlock()
if !ok {
return errWindowUpdateOnInvalidStream
}
stream.UpdateFlowControlWindow(frame.ByteOffset)
return nil
}
// TODO: Handle frame.byteOffset
func (s *Session) handleRstStreamFrame(frame *frames.RstStreamFrame) error {
s.streamsMutex.RLock()