Selaa lähdekoodia

Search - add support for raw reddit links (#663)

* Search - add support for raw reddit links

If a search query starts with 'https://www.reddit.com/' or 'https://old.reddit.com/',
this prefix will be truncated and the query will be processed normally.
For example, a search query 'https://www.reddit.com/r/rust' will redirect to
r/rust.

* Search - support a wider variety of reddit links.

Add once cell dependency for static regex support (avoid compiling the
same regex multiple times).
All search queries are now matched against a regex (provided by @Daniel-Valentine)
that determines if it is a reddit link. If it is, the prefix specifying
the reddit instance will be truncated from the query that will then be
processed normally.
For example, the query 'https://www.reddit.com/r/rust' will be treated
the same way as the query 'r/rust'.
gmnsii 2 vuotta sitten
vanhempi
commit
9e434e7db6
3 muutettua tiedostoa jossa 9 lisäystä ja 1 poistoa
  1. 1 0
      Cargo.lock
  2. 1 0
      Cargo.toml
  3. 7 1
      src/search.rs

+ 1 - 0
Cargo.lock

@@ -677,6 +677,7 @@ dependencies = [
  "hyper-rustls",
  "hyper-rustls",
  "libflate",
  "libflate",
  "lipsum",
  "lipsum",
+ "once_cell",
  "percent-encoding",
  "percent-encoding",
  "regex",
  "regex",
  "route-recognizer",
  "route-recognizer",

+ 1 - 0
Cargo.toml

@@ -27,6 +27,7 @@ url = "2.3.1"
 rust-embed = { version = "6.4.2", features = ["include-exclude"] }
 rust-embed = { version = "6.4.2", features = ["include-exclude"] }
 libflate = "1.2.0"
 libflate = "1.2.0"
 brotli = { version = "3.3.4", features = ["std"] }
 brotli = { version = "3.3.4", features = ["std"] }
+once_cell = "1.16.0"
 
 
 [dev-dependencies]
 [dev-dependencies]
 lipsum = "0.8.2"
 lipsum = "0.8.2"

+ 7 - 1
src/search.rs

@@ -7,6 +7,8 @@ use crate::{
 };
 };
 use askama::Template;
 use askama::Template;
 use hyper::{Body, Request, Response};
 use hyper::{Body, Request, Response};
+use once_cell::sync::Lazy;
+use regex::Regex;
 
 
 // STRUCTS
 // STRUCTS
 struct SearchParams {
 struct SearchParams {
@@ -47,11 +49,15 @@ struct SearchTemplate {
 	no_posts: bool,
 	no_posts: bool,
 }
 }
 
 
+// Regex matched against search queries to determine if they are reddit urls.
+static REDDIT_URL_MATCH: Lazy<Regex> = Lazy::new(|| Regex::new(r"^https?://([^\./]+\.)*reddit.com/").unwrap());
+
 // SERVICES
 // SERVICES
 pub async fn find(req: Request<Body>) -> Result<Response<Body>, String> {
 pub async fn find(req: Request<Body>) -> Result<Response<Body>, String> {
 	let nsfw_results = if setting(&req, "show_nsfw") == "on" { "&include_over_18=on" } else { "" };
 	let nsfw_results = if setting(&req, "show_nsfw") == "on" { "&include_over_18=on" } else { "" };
 	let path = format!("{}.json?{}{}&raw_json=1", req.uri().path(), req.uri().query().unwrap_or_default(), nsfw_results);
 	let path = format!("{}.json?{}{}&raw_json=1", req.uri().path(), req.uri().query().unwrap_or_default(), nsfw_results);
-	let query = param(&path, "q").unwrap_or_default();
+	let mut query = param(&path, "q").unwrap_or_default();
+	query = REDDIT_URL_MATCH.replace(&query, "").to_string();
 
 
 	if query.is_empty() {
 	if query.is_empty() {
 		return Ok(redirect("/".to_string()));
 		return Ok(redirect("/".to_string()));