From 20d9a5e573c0f30acf40cadb1278be968824172d Mon Sep 17 00:00:00 2001 From: yggverse Date: Mon, 8 Sep 2025 22:13:28 +0300 Subject: [PATCH] decode search query --- src/main.rs | 2 +- src/route.rs | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 1b04279..ef2a654 100644 --- a/src/main.rs +++ b/src/main.rs @@ -157,7 +157,7 @@ fn response( debug!("Incoming request from `{peer}` to `{}`", request.url.path()); send( &match Route::from_url(&request.url) { - Route::List { page } => match list(config, public, request.url.query(), page) { + Route::List { page, keyword } => match list(config, public, keyword.as_deref(), page) { Ok(data) => success::Default { data: data.as_bytes(), meta: success::default::Meta { diff --git a/src/route.rs b/src/route.rs index 4e6e578..8cad82f 100644 --- a/src/route.rs +++ b/src/route.rs @@ -6,7 +6,10 @@ use url::Url; pub enum Route { Info(Id20), - List { page: Option }, + List { + keyword: Option, + page: Option, + }, NotFound, Search, } @@ -17,7 +20,10 @@ impl Route { let q = url.query(); if p.is_empty() { - return Self::List { page: None }; + return Self::List { + keyword: None, + page: None, + }; } if let Ok(id) = Id20::from_str(p.trim_matches('/')) { @@ -30,6 +36,7 @@ impl Route { if Regex::new(r"^/(|search)").unwrap().is_match(&p) { return Self::List { + keyword: q.and_then(|k| urlencoding::decode(k).ok().map(|k| k.into())), page: Regex::new(r"/(\d+)$").unwrap().captures(&p).map(|c| { c.get(1) .map_or(1, |p| p.as_str().parse::().unwrap_or(1))