Browse Source

Add PingFrame

Brad Fitzpatrick 11 years ago
parent
commit
4d4c38ad9f
1 changed files with 33 additions and 6 deletions
  1. 33 6
      frame.go

+ 33 - 6
frame.go

@@ -62,8 +62,9 @@ func (f Flags) Has(v Flags) bool {
 
 // Frame-specific FrameHeader flag bits.
 const (
-	// Settings Frame
-	FlagSettingsAck Flags = 0x1
+	// Data Frame
+	FlagDataEndStream Flags = 0x1
+	FlagDataPadded    Flags = 0x8
 
 	// Headers Frame
 	FlagHeadersEndStream  Flags = 0x1
@@ -72,9 +73,11 @@ const (
 	FlagHeadersPadded     Flags = 0x8
 	FlagHeadersPriority   Flags = 0x20
 
-	// Data Frame
-	FlagDataEndStream Flags = 0x1
-	FlagDataPadded    Flags = 0x8
+	// Settings Frame
+	FlagSettingsAck Flags = 0x1
+
+	// Ping Frame
+	FlagPingAck Flags = 0x1
 
 	// Continuation Frame
 	FlagContinuationEndHeaders Flags = 0x4
@@ -121,7 +124,7 @@ var frameParsers = map[FrameType]frameParser{
 	FrameRSTStream:    parseRSTStreamFrame,
 	FrameSettings:     parseSettingsFrame,
 	FramePushPromise:  nil, // TODO
-	FramePing:         nil, // TODO
+	FramePing:         parsePingFrame,
 	FrameGoAway:       nil, // TODO
 	FrameWindowUpdate: parseWindowUpdateFrame,
 	FrameContinuation: parseContinuationFrame,
@@ -366,6 +369,30 @@ func (f *SettingsFrame) ForeachSetting(fn func(s SettingID, v uint32)) {
 	}
 }
 
+// A PingFrame is a mechanism for measuring a minimal round trip time
+// from the sender, as well as determining whether an idle connection
+// is still functional.
+// See http://http2.github.io/http2-spec/#rfc.section.6.7
+type PingFrame struct {
+	FrameHeader
+	data []byte
+}
+
+func (f *PingFrame) Data() []byte {
+	f.checkValid()
+	return f.data
+}
+
+func parsePingFrame(fh FrameHeader, payload []byte) (Frame, error) {
+	if len(payload) != 8 {
+		return nil, ConnectionError(ErrCodeFrameSize)
+	}
+	if fh.StreamID != 0 {
+		return nil, ConnectionError(ErrCodeProtocol)
+	}
+	return &PingFrame{fh, payload}, nil
+}
+
 // An UnknownFrame is the frame type returned when the frame type is unknown
 // or no specific frame type parser exists.
 type UnknownFrame struct {