Browse Source

Add Framer.WriteGoAway, fix debug-data accessor bug, add tests.

Brad Fitzpatrick 11 years ago
parent
commit
7eaffb4084
2 changed files with 43 additions and 1 deletions
  1. 9 1
      frame.go
  2. 34 0
      frame_test.go

+ 9 - 1
frame.go

@@ -595,10 +595,18 @@ func parseGoAwayFrame(fh FrameHeader, p []byte) (Frame, error) {
 		FrameHeader:  fh,
 		LastStreamID: binary.BigEndian.Uint32(p[:4]) & (1<<31 - 1),
 		ErrCode:      binary.BigEndian.Uint32(p[4:8]),
-		debugData:    p[:8],
+		debugData:    p[8:],
 	}, nil
 }
 
+func (f *Framer) WriteGoAway(maxStreamID uint32, code ErrCode, debugData []byte) error {
+	f.startWrite(FrameGoAway, 0, 0)
+	f.writeUint32(maxStreamID & (1<<31 - 1))
+	f.writeUint32(uint32(code))
+	f.writeBytes(debugData)
+	return f.endWrite()
+}
+
 // An UnknownFrame is the frame type returned when the frame type is unknown
 // or no specific frame type parser exists.
 type UnknownFrame struct {

+ 34 - 0
frame_test.go

@@ -466,3 +466,37 @@ func TestWriteTooLargeFrame(t *testing.T) {
 		t.Errorf("endWrite = %v; want errFrameTooLarge", err)
 	}
 }
+
+func TestWriteGoAway(t *testing.T) {
+	const debug = "foo"
+	fr, buf := testFramer()
+	if err := fr.WriteGoAway(0x01020304, 0x05060708, []byte(debug)); err != nil {
+		t.Fatal(err)
+	}
+	const wantEnc = "\x00\x00\v\a\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08" + debug
+	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 := &GoAwayFrame{
+		FrameHeader: FrameHeader{
+			valid:    true,
+			Type:     0x7,
+			Flags:    0,
+			Length:   uint32(4 + 4 + len(debug)),
+			StreamID: 0,
+		},
+		LastStreamID: 0x01020304,
+		ErrCode:      0x05060708,
+		debugData:    []byte(debug),
+	}
+	if !reflect.DeepEqual(f, want) {
+		t.Fatalf("parsed back:\n%#v\nwant:\n%#v", f, want)
+	}
+	if got := string(f.(*GoAwayFrame).DebugData()); got != debug {
+		t.Errorf("debug data = %q; want %q", got, debug)
+	}
+}