ReadExtension reads the next object from the reader as an extension. ReadExtension will fail if the next object in the stream is not an extension, or if e.Type() is not the same as the wire type.
(e Extension)
| 375 | // object in the stream is not an extension, or if |
| 376 | // e.Type() is not the same as the wire type. |
| 377 | func (m *Reader) ReadExtension(e Extension) error { |
| 378 | offset, length, extType, err := m.peekExtensionHeader() |
| 379 | if err != nil { |
| 380 | return err |
| 381 | } |
| 382 | |
| 383 | if expectedType := e.ExtensionType(); extType != expectedType { |
| 384 | return errExt(extType, expectedType) |
| 385 | } |
| 386 | if uint32(length) > m.GetMaxElements() { |
| 387 | return ErrLimitExceeded |
| 388 | } |
| 389 | |
| 390 | p, err := m.R.Peek(offset + length) |
| 391 | if err != nil { |
| 392 | return err |
| 393 | } |
| 394 | err = e.UnmarshalBinary(p[offset:]) |
| 395 | if err == nil { |
| 396 | // consume the peeked bytes |
| 397 | _, err = m.R.Skip(offset + length) |
| 398 | } |
| 399 | return err |
| 400 | } |
| 401 | |
| 402 | // ReadExtensionRaw reads the next object from the reader |
| 403 | // as an extension. The returned slice is only |