Browse Source

Add Framer.WritePing

Brad Fitzpatrick 11 years ago
parent
commit
2e5b5040dd
2 changed files with 46 additions and 0 deletions
  1. 10 0
      frame.go
  2. 36 0
      frame_test.go

+ 10 - 0
frame.go

@@ -556,6 +556,16 @@ func parsePingFrame(fh FrameHeader, payload []byte) (Frame, error) {
 	return f, nil
 }
 
+func (f *Framer) WritePing(ack bool, data [8]byte) error {
+	var flags Flags
+	if ack {
+		flags = FlagPingAck
+	}
+	f.startWrite(FramePing, flags, 0)
+	f.writeBytes(data[:])
+	return f.endWrite()
+}
+
 // A GoAwayFrame informs the remote peer to stop creating streams on this connection.
 // See http://http2.github.io/http2-spec/#rfc.section.6.8
 type GoAwayFrame struct {

+ 36 - 0
frame_test.go

@@ -383,6 +383,42 @@ func TestWriteWindowUpdate(t *testing.T) {
 	}
 }
 
+func TestWritePing(t *testing.T)    { testWritePing(t, false) }
+func TestWritePingAck(t *testing.T) { testWritePing(t, true) }
+
+func testWritePing(t *testing.T, ack bool) {
+	fr, buf := testFramer()
+	if err := fr.WritePing(ack, [8]byte{1, 2, 3, 4, 5, 6, 7, 8}); err != nil {
+		t.Fatal(err)
+	}
+	var wantFlags Flags
+	if ack {
+		wantFlags = FlagPingAck
+	}
+	var wantEnc = "\x00\x00\x08\x06" + string(wantFlags) + "\x00\x00\x00\x00" + "\x01\x02\x03\x04\x05\x06\x07\x08"
+	if buf.String() != wantEnc {
+		t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc)
+	}
+
+	f, err := fr.ReadFrame()
+	if err != nil {
+		t.Fatal(err)
+	}
+	want := &PingFrame{
+		FrameHeader: FrameHeader{
+			valid:    true,
+			Type:     0x6,
+			Flags:    wantFlags,
+			Length:   0x8,
+			StreamID: 0,
+		},
+		Data: [8]byte{1, 2, 3, 4, 5, 6, 7, 8},
+	}
+	if !reflect.DeepEqual(f, want) {
+		t.Errorf("parsed back %#v; want %#v", f, want)
+	}
+}
+
 func TestReadFrameHeader(t *testing.T) {
 	tests := []struct {
 		len      uint32