func (frame *RST_STREAM) ReadFrom(reader io.Reader) (int64, error) { c := common.ReadCounter{R: reader} data, err := common.ReadExactly(&c, 16) if err != nil { return c.N, err } err = controlFrameCommonProcessing(data[:5], _RST_STREAM, 0) if err != nil { return c.N, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length != 8 { return c.N, common.IncorrectDataLength(length, 8) } else if length > common.MAX_FRAME_SIZE-8 { return c.N, common.FrameTooLarge } frame.StreamID = common.StreamID(common.BytesToUint32(data[8:12])) frame.Status = common.StatusCode(common.BytesToUint32(data[12:16])) if !frame.StreamID.Valid() { return c.N, common.StreamIdTooLarge } return c.N, nil }
func (frame *GOAWAY) ReadFrom(reader io.Reader) (int64, error) { data, err := common.ReadExactly(reader, 16) if err != nil { return 0, err } err = controlFrameCommonProcessing(data[:5], _GOAWAY, 0) if err != nil { return 16, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length != 8 { return 16, common.IncorrectDataLength(length, 8) } frame.LastGoodStreamID = common.StreamID(common.BytesToUint32(data[8:12])) frame.Status = common.StatusCode(common.BytesToUint32(data[12:16])) if !frame.LastGoodStreamID.Valid() { return 16, common.StreamIdTooLarge } return 16, nil }
func (frame *WINDOW_UPDATE) ReadFrom(reader io.Reader) (int64, error) { c := common.ReadCounter{R: reader} data, err := common.ReadExactly(&c, 16) if err != nil { return c.N, err } err = controlFrameCommonProcessing(data[:5], _WINDOW_UPDATE, 0) if err != nil { return c.N, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length != 8 { return c.N, common.IncorrectDataLength(length, 8) } frame.StreamID = common.StreamID(common.BytesToUint32(data[8:12])) frame.DeltaWindowSize = common.BytesToUint32(data[12:16]) if !frame.StreamID.Valid() { return c.N, common.StreamIdTooLarge } if frame.StreamID.Zero() { return c.N, common.StreamIdIsZero } if frame.DeltaWindowSize > common.MAX_DELTA_WINDOW_SIZE { return c.N, errors.New("Error: Delta Window Size too large.") } return c.N, nil }
func (frame *SYN_REPLY) ReadFrom(reader io.Reader) (int64, error) { data, err := common.ReadExactly(reader, 12) if err != nil { return 0, err } err = controlFrameCommonProcessing(data[:5], _SYN_REPLY, common.FLAG_FIN) if err != nil { return 12, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length < 4 { return 12, common.IncorrectDataLength(length, 4) } else if length > common.MAX_FRAME_SIZE-8 { return 12, common.FrameTooLarge } // Read in data. header, err := common.ReadExactly(reader, length-4) if err != nil { return 12, err } frame.Flags = common.Flags(data[4]) frame.StreamID = common.StreamID(common.BytesToUint32(data[8:12])) frame.rawHeader = header return int64(length + 8), nil }
func (frame *GOAWAY) ReadFrom(reader io.Reader) (int64, error) { c := common.ReadCounter{R: reader} data, err := common.ReadExactly(&c, 12) if err != nil { return c.N, err } err = controlFrameCommonProcessing(data[:5], _GOAWAY, 0) if err != nil { return c.N, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length != 4 { return c.N, common.IncorrectDataLength(length, 4) } frame.LastGoodStreamID = common.StreamID(common.BytesToUint32(data[8:12])) if !frame.LastGoodStreamID.Valid() { return c.N, common.StreamIdTooLarge } return c.N, nil }
func (frame *SYN_STREAM) ReadFrom(reader io.Reader) (int64, error) { c := common.ReadCounter{R: reader} data, err := common.ReadExactly(&c, 18) if err != nil { return c.N, err } err = controlFrameCommonProcessing(data[:5], _SYN_STREAM, common.FLAG_FIN|common.FLAG_UNIDIRECTIONAL) if err != nil { return c.N, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length < 10 { return c.N, common.IncorrectDataLength(length, 10) } else if length > common.MAX_FRAME_SIZE-18 { return c.N, common.FrameTooLarge } // Read in data. header, err := common.ReadExactly(&c, length-10) if err != nil { return c.N, err } frame.Flags = common.Flags(data[4]) frame.StreamID = common.StreamID(common.BytesToUint32(data[8:12])) frame.AssocStreamID = common.StreamID(common.BytesToUint32(data[12:16])) frame.Priority = common.Priority(data[16] >> 5) frame.Slot = data[17] frame.rawHeader = header if !frame.StreamID.Valid() { return c.N, common.StreamIdTooLarge } if frame.StreamID.Zero() { return c.N, common.StreamIdIsZero } if !frame.AssocStreamID.Valid() { return c.N, common.StreamIdTooLarge } return c.N, nil }
func (frame *DATA) ReadFrom(reader io.Reader) (int64, error) { c := common.ReadCounter{R: reader} data, err := common.ReadExactly(&c, 8) if err != nil { return c.N, err } // Check it's a data frame. if data[0]&0x80 == 1 { return c.N, common.IncorrectFrame(_CONTROL_FRAME, _DATA_FRAME, 3) } // Check flags. if data[4] & ^byte(common.FLAG_FIN) != 0 { return c.N, common.InvalidField("flags", int(data[4]), common.FLAG_FIN) } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length == 0 && data[4] == 0 { return c.N, common.IncorrectDataLength(length, 1) } else if length > common.MAX_FRAME_SIZE-8 { return c.N, common.FrameTooLarge } // Read in data. if length != 0 { frame.Data, err = common.ReadExactly(&c, length) if err != nil { return c.N, err } } frame.StreamID = common.StreamID(common.BytesToUint32(data[0:4])) frame.Flags = common.Flags(data[4]) if frame.Data == nil { frame.Data = []byte{} } return c.N, nil }
func (frame *HEADERS) ReadFrom(reader io.Reader) (int64, error) { c := common.ReadCounter{R: reader} data, err := common.ReadExactly(&c, 16) if err != nil { return c.N, err } err = controlFrameCommonProcessing(data[:5], _HEADERS, common.FLAG_FIN) if err != nil { return c.N, err } // Get and check length. length := int(common.BytesToUint24(data[5:8])) if length < 6 { return c.N, common.IncorrectDataLength(length, 6) } else if length > common.MAX_FRAME_SIZE-8 { return c.N, common.FrameTooLarge } // Read in data. header, err := common.ReadExactly(&c, length-8) if err != nil { return c.N, err } frame.Flags = common.Flags(data[4]) frame.StreamID = common.StreamID(common.BytesToUint32(data[8:12])) frame.rawHeader = header if !frame.StreamID.Valid() { return c.N, common.StreamIdTooLarge } if frame.StreamID.Zero() { return c.N, common.StreamIdIsZero } return c.N, nil }