pub struct FetchObjectHeader {
pub group_id: VarInt,
pub subgroup_id: VarInt,
pub object_id: VarInt,
pub publisher_priority: u8,
pub extension_headers_length: VarInt,
pub extensions: Vec<u8>,
pub object_status: ObjectStatus,
pub payload_length: VarInt,
}Expand description
Object within a fetch stream (draft-10).
Uses extension_headers_length instead of extension_count.
Fields§
§group_id: VarIntGroup identifier.
subgroup_id: VarIntSubgroup identifier within the group.
object_id: VarIntObject identifier within the subgroup.
publisher_priority: u8Publisher priority for delivery ordering.
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).
object_status: ObjectStatusStatus of this object.
payload_length: VarIntLength of the object payload in bytes.
Implementations§
Source§impl FetchObjectHeader
impl FetchObjectHeader
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 9.4.4 puts the Object Status field on the wire only when the
Object Payload Length is zero, and Section 9.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 a fetch object header from the buffer.
Trait Implementations§
Source§impl Clone for FetchObjectHeader
impl Clone for FetchObjectHeader
Source§fn clone(&self) -> FetchObjectHeader
fn clone(&self) -> FetchObjectHeader
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more