| package http2interop | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"io" | 
 | ) | 
 |  | 
 | type PingFrame struct { | 
 | 	Header FrameHeader | 
 | 	Data   []byte | 
 | } | 
 |  | 
 | const ( | 
 | 	PING_ACK = 0x01 | 
 | ) | 
 |  | 
 | func (f *PingFrame) GetHeader() *FrameHeader { | 
 | 	return &f.Header | 
 | } | 
 |  | 
 | func (f *PingFrame) ParsePayload(r io.Reader) error { | 
 | 	raw := make([]byte, f.Header.Length) | 
 | 	if _, err := io.ReadFull(r, raw); err != nil { | 
 | 		return err | 
 | 	} | 
 | 	return f.UnmarshalPayload(raw) | 
 | } | 
 |  | 
 | func (f *PingFrame) UnmarshalPayload(raw []byte) error { | 
 | 	if f.Header.Length != len(raw) { | 
 | 		return fmt.Errorf("Invalid Payload length %d != %d", f.Header.Length, len(raw)) | 
 | 	} | 
 | 	if f.Header.Length != 8 { | 
 | 		return fmt.Errorf("Invalid Payload length %d", f.Header.Length) | 
 | 	} | 
 |  | 
 | 	f.Data = []byte(string(raw)) | 
 |  | 
 | 	return nil | 
 | } | 
 |  | 
 | func (f *PingFrame) MarshalPayload() ([]byte, error) { | 
 | 	if len(f.Data) != 8 { | 
 | 		return nil, fmt.Errorf("Invalid Payload length %d", len(f.Data)) | 
 | 	} | 
 | 	return []byte(string(f.Data)), nil | 
 | } | 
 |  | 
 | func (f *PingFrame) MarshalBinary() ([]byte, error) { | 
 | 	payload, err := f.MarshalPayload() | 
 | 	if err != nil { | 
 | 		return nil, err | 
 | 	} | 
 |  | 
 | 	f.Header.Length = len(payload) | 
 | 	f.Header.Type = PingFrameType | 
 | 	header, err := f.Header.MarshalBinary() | 
 | 	if err != nil { | 
 | 		return nil, err | 
 | 	} | 
 |  | 
 | 	header = append(header, payload...) | 
 |  | 
 | 	return header, nil | 
 | } |