pub struct ObjectHeader {
pub object_id: VarInt,
pub extension_headers_length: VarInt,
pub extensions: Vec<u8>,
pub payload_length: VarInt,
pub object_status: ObjectStatus,
}Expand description
Object within a subgroup stream (draft-09).
Encoding: object_id(vi), extension_headers_length(vi), [extensions…], payload_length(vi), if payload_length == 0: object_status(vi) else: payload bytes
Fields§
§object_id: VarIntObject identifier within the subgroup.
extension_headers_length: VarIntTotal byte length of extension headers, as it arrived.
Advisory on encode. Every encoder here writes
VarInt::from_usize(self.extensions.len()) and never reads this field,
so a hand-built header whose stated length disagrees with the bytes
beside it goes on the wire with the derived length and is read back
consistent. Decoding always sets the two together, so a value that came
off the wire never disagrees.
It is kept because it is what the peer stated, which is not always recoverable from the bytes: a non-minimal varint length encodes the same number in more bytes, and a relay that must forward the block unchanged has to know which it saw.
extensions: Vec<u8>Raw extension bytes (opaque).
payload_length: VarIntLength of the object payload in bytes.
object_status: ObjectStatusStatus of this object.
Implementations§
Source§impl ObjectHeader
impl ObjectHeader
Sourcepub fn encode_checked(&self, buf: &mut impl BufMut) -> Result<(), CodecError>
pub fn encode_checked(&self, buf: &mut impl BufMut) -> Result<(), CodecError>
Encode the header, refusing a status the framing cannot carry.
Section 8.4.1 puts the Object Status field on the wire only when the
Object Payload Length is zero, and Section 8.1.1.1 says “Any object
with a status code other than zero MUST have an empty payload”. A
non-zero status paired with a non-zero payload length therefore has no
encoding at all: Self::encode drops the status and the peer reads an
ordinary object, which is a different object from the one the caller
described. This refuses instead.
The datagram types on this draft already refuse the same pairing. These two did not, and they are the ones a publisher writes on every stream.
§Errors
CodecError::InvalidField if a non-zero Object Status is paired with
a non-zero Object Payload Length.
Sourcepub fn decode(buf: &mut impl Buf) -> Result<Self, CodecError>
pub fn decode(buf: &mut impl Buf) -> Result<Self, CodecError>
Decode an object header from the buffer.
Trait Implementations§
Source§impl Clone for ObjectHeader
impl Clone for ObjectHeader
Source§fn clone(&self) -> ObjectHeader
fn clone(&self) -> ObjectHeader
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more