Browse Source

add RSTStreamFrame

Brad Fitzpatrick 11 years ago
parent
commit
6ed6db34bd
1 changed files with 15 additions and 1 deletions
  1. 15 1
      frame.go

+ 15 - 1
frame.go

@@ -118,7 +118,7 @@ var frameParsers = map[FrameType]frameParser{
 	FrameData:         parseDataFrame,
 	FrameHeaders:      parseHeadersFrame,
 	FramePriority:     nil, // TODO
-	FrameRSTStream:    nil, // TODO
+	FrameRSTStream:    parseRSTStreamFrame,
 	FrameSettings:     parseSettingsFrame,
 	FramePushPromise:  nil, // TODO
 	FramePing:         nil, // TODO
@@ -465,6 +465,20 @@ func parseHeadersFrame(fh FrameHeader, p []byte) (_ Frame, err error) {
 	return hf, nil
 }
 
+// A RSTStreamFrame allows for abnormal termination of a stream.
+// See http://http2.github.io/http2-spec/#rfc.section.6.4
+type RSTStreamFrame struct {
+	FrameHeader
+	ErrCode uint32
+}
+
+func parseRSTStreamFrame(fh FrameHeader, p []byte) (Frame, error) {
+	if fh.StreamID == 0 || len(p) < 4 {
+		return nil, ConnectionError(ErrCodeProtocol)
+	}
+	return &RSTStreamFrame{fh, binary.BigEndian.Uint32(p[:4])}, nil
+}
+
 // A ContinuationFrame is used to continue a sequence of header block fragments.
 // See http://http2.github.io/http2-spec/#rfc.section.6.10
 type ContinuationFrame struct {