func (s *ResponseStream) ReceiveFrame(frame common.Frame) error { s.Lock() defer s.Unlock() if frame == nil { return errors.New("Error: Nil frame received.") } // Process the frame depending on its type. switch frame := frame.(type) { case *frames.DATA: s.requestBody.Write(frame.Data) s.flow.Receive(frame.Data) if frame.Flags.FIN() { select { case <-s.ready: default: close(s.ready) } s.state.CloseThere() } case *frames.SYN_REPLY: common.UpdateHeader(s.header, frame.Header) if frame.Flags.FIN() { select { case <-s.ready: default: close(s.ready) } s.state.CloseThere() } case *frames.HEADERS: common.UpdateHeader(s.header, frame.Header) case *frames.WINDOW_UPDATE: err := s.flow.UpdateWindow(frame.DeltaWindowSize) if err != nil { reply := new(frames.RST_STREAM) reply.StreamID = s.streamID reply.Status = common.RST_STREAM_FLOW_CONTROL_ERROR s.output <- reply return err } default: return errors.New(fmt.Sprintf("Received unknown frame of type %T.", frame)) } return nil }
func (s *ResponseStream) ReceiveFrame(frame common.Frame) error { s.Lock() defer s.Unlock() if frame == nil { return errors.New("Error: Nil frame received.") } // Process the frame depending on its type. switch frame := frame.(type) { case *frames.DATA: s.requestBody.Write(frame.Data) if frame.Flags.FIN() { select { case <-s.ready: default: close(s.ready) } s.state.CloseThere() } case *frames.SYN_REPLY: common.UpdateHeader(s.header, frame.Header) if frame.Flags.FIN() { select { case <-s.ready: default: close(s.ready) } s.state.CloseThere() } case *frames.HEADERS: common.UpdateHeader(s.header, frame.Header) case *frames.WINDOW_UPDATE: // Ignore. default: return errors.New(fmt.Sprintf("Received unknown frame of type %T.", frame)) } return nil }