From 25e3ebb2436d469bdf1e92e10f2836c21bb1585c Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 22 Feb 2025 05:24:27 +0200 Subject: [PATCH] hold parsed, valid url for gemini request --- Cargo.toml | 1 + src/request/gemini.rs | 12 +++++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0042535..c6cd49e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,4 @@ repository = "https://github.com/YGGverse/titanite" [dependencies] anyhow = "1.0.96" regex = "1.11.1" +url = "2.5.4" diff --git a/src/request/gemini.rs b/src/request/gemini.rs index e9568e2..c57f38a 100644 --- a/src/request/gemini.rs +++ b/src/request/gemini.rs @@ -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 { 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 { - 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); }