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'.
This commit is contained in:
gmnsii 2022-12-31 19:57:42 -08:00 committed by GitHub
parent ab30b8bbec
commit 9e434e7db6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 9 additions and 1 deletions

1
Cargo.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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()));