update meta parser

This commit is contained in:
yggverse 2024-10-30 05:41:25 +02:00
parent f8fa101c59
commit 8c1afd654a
2 changed files with 41 additions and 18 deletions

View file

@ -53,13 +53,13 @@ impl Header {
match Status::from_header(&buffer) { match Status::from_header(&buffer) {
Ok(status) => Ok(Self { Ok(status) => Ok(Self {
status, status,
meta: match Meta::from_header(&buffer) { meta: match Meta::from(&buffer) {
Ok(meta) => Some(meta), Ok(meta) => Some(meta),
Err(_) => None, Err(_) => None, // @TODO handle
}, },
mime: match Mime::from_header(&buffer) { mime: match Mime::from_header(&buffer) {
Ok(mime) => Some(mime), Ok(mime) => Some(mime),
Err(_) => None, Err(_) => None, // @TODO handle
}, },
}), }),
Err(reason) => Err(( Err(reason) => Err((

View file

@ -9,27 +9,50 @@ use glib::GString;
/// * placeholder for 10, 11 status /// * placeholder for 10, 11 status
/// * URL for 30, 31 status /// * URL for 30, 31 status
pub struct Meta { pub struct Meta {
buffer: Vec<u8>, value: Option<GString>,
} }
impl Meta { impl Meta {
pub fn from_header(buffer: &[u8]) -> Result<Self, Error> { /// Parse Meta from UTF-8
pub fn from(buffer: &[u8]) -> Result<Self, Error> {
// Init bytes buffer
let mut bytes: Vec<u8> = Vec::new();
// Skip status code
match buffer.get(3..) { match buffer.get(3..) {
Some(value) => Ok(Self { Some(slice) => {
buffer: value.to_vec(), for (count, &byte) in slice.iter().enumerate() {
}), // Validate length
None => return Err(Error::Protocol), // @TODO optional if count > 0x400 {
} // 1024
return Err(Error::Protocol);
} }
pub fn to_gstring(&self) -> Result<GString, Error> { // End of line, done
match GString::from_utf8(self.buffer.clone()) { if byte == b'\r' {
Ok(result) => Ok(result), break;
}
// Append
bytes.push(byte);
}
// Assumes the bytes are valid UTF-8
match GString::from_utf8(bytes) {
Ok(value) => Ok(Self {
value: match value.is_empty() {
true => None,
false => Some(value),
},
}),
Err(_) => Err(Error::Decode), Err(_) => Err(Error::Decode),
} }
} }
None => Err(Error::Protocol),
}
}
pub fn buffer(&self) -> &[u8] { pub fn value(&self) -> &Option<GString> {
&self.buffer &self.value
} }
} }