hold parsed, valid url for gemini request

This commit is contained in:
yggverse 2025-02-22 05:24:27 +02:00
parent 7264d935be
commit 25e3ebb243
2 changed files with 6 additions and 7 deletions

View file

@ -12,3 +12,4 @@ repository = "https://github.com/YGGverse/titanite"
[dependencies]
anyhow = "1.0.96"
regex = "1.11.1"
url = "2.5.4"

View file

@ -1,21 +1,19 @@
use anyhow::Result;
use url::Url;
/// [Gemini](https://geminiprotocol.net/docs/protocol-specification.gmi) request
pub struct Gemini {
pub url: String,
pub url: Url,
}
impl Gemini {
pub fn from_bytes(buffer: &[u8]) -> Result<Self> {
Ok(Self {
url: String::from_utf8(crate::request::header_bytes(buffer)?.to_vec())?,
url: Url::parse(std::str::from_utf8(crate::request::header_bytes(buffer)?)?)?,
})
}
pub fn into_bytes(self) -> Vec<u8> {
let mut bytes = Vec::with_capacity(self.url.len() + 2);
bytes.extend(self.url.into_bytes());
bytes.extend(b"\r\n");
bytes
format!("{}\r\n", self.url).into_bytes()
}
}
@ -23,6 +21,6 @@ impl Gemini {
fn test() {
const REQUEST: &[u8] = "gemini://geminiprotocol.net\r\n".as_bytes();
let request = Gemini::from_bytes(REQUEST).unwrap();
assert_eq!(request.url, "gemini://geminiprotocol.net");
assert_eq!(request.url.as_str(), "gemini://geminiprotocol.net");
assert_eq!(request.into_bytes(), REQUEST);
}