1 //! Extensions specific to the HTTP/2 protocol. 2 3 use crate::hpack::BytesStr; 4 5 use bytes::Bytes; 6 use std::fmt; 7 8 /// Represents the `:protocol` pseudo-header used by 9 /// the [Extended CONNECT Protocol]. 10 /// 11 /// [Extended CONNECT Protocol]: https://datatracker.ietf.org/doc/html/rfc8441#section-4 12 #[derive(Clone, Eq, PartialEq)] 13 pub struct Protocol { 14 value: BytesStr, 15 } 16 17 impl Protocol { 18 /// Converts a static string to a protocol name. from_static(value: &'static str) -> Self19 pub const fn from_static(value: &'static str) -> Self { 20 Self { 21 value: BytesStr::from_static(value), 22 } 23 } 24 25 /// Returns a str representation of the header. as_str(&self) -> &str26 pub fn as_str(&self) -> &str { 27 self.value.as_str() 28 } 29 try_from(bytes: Bytes) -> Result<Self, std::str::Utf8Error>30 pub(crate) fn try_from(bytes: Bytes) -> Result<Self, std::str::Utf8Error> { 31 Ok(Self { 32 value: BytesStr::try_from(bytes)?, 33 }) 34 } 35 } 36 37 impl<'a> From<&'a str> for Protocol { from(value: &'a str) -> Self38 fn from(value: &'a str) -> Self { 39 Self { 40 value: BytesStr::from(value), 41 } 42 } 43 } 44 45 impl AsRef<[u8]> for Protocol { as_ref(&self) -> &[u8]46 fn as_ref(&self) -> &[u8] { 47 self.value.as_ref() 48 } 49 } 50 51 impl fmt::Debug for Protocol { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result52 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 53 self.value.fmt(f) 54 } 55 } 56