From ebf630194148b1f15b6c0144ce868a45fce5cd47 Mon Sep 17 00:00:00 2001
From: Vincent Ambo
Date: Wed, 12 May 2021 13:54:01 +0200
Subject: feat(atward): Support reading configuration from cookies
Adds support for reading configuration (currently only the `cs`
parameter) from cookies and from URL query parameters. The latter take
precedence if set explicitly.
This is useful for users which can not edit their search query
parameters.
To make this easier to use the atward landing page has been updated
with a simple form where settings can be toggled. This requires
Javascript, but the script is small, embedded and MIT licensed (as is
the rest of this project). Users without Javascript will be shown a
notice about this.
It is of course possible to set the cookies manually, too.
Change-Id: Ie9a9dbeab4d9a97a349d7988e21f1b46037e1f72
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3110
Tested-by: BuildkiteCI
Reviewed-by: sterni
---
web/atward/src/index.html | 49 +++++++++++++++++++---
web/atward/src/main.rs | 105 ++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 139 insertions(+), 15 deletions(-)
diff --git a/web/atward/src/index.html b/web/atward/src/index.html
index 286bc6e546ad..a62d168bda0e 100644
--- a/web/atward/src/index.html
+++ b/web/atward/src/index.html
@@ -6,7 +6,28 @@
TVL Search
-
+
+
cs=true - use Sourcegraph instead of cgit to view code
-
- In Firefox, configuring query parameters is difficult as
- users can not edit search engines directly. There are browser
- extensions and other workarounds for this issue, but we do not
- recommend any particular one.
+
+ In some browsers (like Firefox) users can not edit query
+ parameters for search engines. As an alternative configuration can
+ be supplied via cookies with the same names as the configuration
+ parameters.
+
+
+ The form below can set this configuration:
+
+
Source code
diff --git a/web/atward/src/main.rs b/web/atward/src/main.rs
index 04beb02cd5d6..b29877c6c00e 100644
--- a/web/atward/src/main.rs
+++ b/web/atward/src/main.rs
@@ -5,7 +5,8 @@
//! browsers and attempts to send users to useful locations based on
//! their search query (falling back to another search engine).
use regex::Regex;
-use rouille::Response;
+use rouille::input::cookies;
+use rouille::{Request, Response};
/// A query handler supported by atward. It consists of a pattern on
/// which to match and trigger the query, and a function to execute
@@ -23,6 +24,7 @@ struct Handler {
}
/// An Atward query supplied by a user.
+#[derive(Debug, PartialEq)]
struct Query {
/// Query string itself.
query: String,
@@ -31,19 +33,38 @@ struct Query {
cs: bool,
}
+/// Helper function for setting a parameter based on a query
+/// parameter.
+fn query_setting(req: &Request, config: &mut bool, param: &str) {
+ match req.get_param(param) {
+ Some(s) if s == "true" => *config = true,
+ Some(s) if s == "false" => *config = false,
+ _ => {}
+ }
+}
+
impl Query {
- fn from_request(req: &rouille::Request) -> Option {
- let query = match req.get_param("q") {
- Some(q) => q,
+ fn from_request(req: &Request) -> Option {
+ // First extract the actual search query ...
+ let mut query = match req.get_param("q") {
+ Some(query) => Query { query, cs: false },
None => return None,
};
- let cs = match req.get_param("cs") {
- Some(s) if s == "true" => true,
- _ => false,
- };
+ // ... then apply settings to it. Settings in query parameters
+ // take precedence over cookies.
+ for cookie in cookies(req) {
+ match cookie {
+ ("cs", "true") => {
+ query.cs = true;
+ }
+ _ => {}
+ }
+ }
- Some(Query { query, cs })
+ query_setting(req, &mut query.cs, "cs");
+
+ Some(query)
}
}
@@ -228,4 +249,70 @@ mod tests {
None
);
}
+
+ #[test]
+ fn request_to_query() {
+ assert_eq!(
+ Query::from_request(&Request::fake_http("GET", "/?q=b%2F42", vec![], vec![]))
+ .expect("request should parse to a query"),
+ Query {
+ query: "b/42".to_string(),
+ cs: false,
+ },
+ );
+
+ assert_eq!(
+ Query::from_request(&Request::fake_http("GET", "/", vec![], vec![])),
+ None
+ );
+ }
+
+ #[test]
+ fn settings_from_cookie() {
+ assert_eq!(
+ Query::from_request(&Request::fake_http(
+ "GET",
+ "/?q=b%2F42",
+ vec![("Cookie".to_string(), "cs=true;".to_string())],
+ vec![]
+ ))
+ .expect("request should parse to a query"),
+ Query {
+ query: "b/42".to_string(),
+ cs: true,
+ },
+ );
+ }
+
+ #[test]
+ fn settings_from_query_parameter() {
+ assert_eq!(
+ Query::from_request(&Request::fake_http(
+ "GET",
+ "/?q=b%2F42&cs=true",
+ vec![],
+ vec![]
+ ))
+ .expect("request should parse to a query"),
+ Query {
+ query: "b/42".to_string(),
+ cs: true,
+ },
+ );
+
+ // Query parameter should override cookie
+ assert_eq!(
+ Query::from_request(&Request::fake_http(
+ "GET",
+ "/?q=b%2F42&cs=false",
+ vec![("Cookie".to_string(), "cs=true;".to_string())],
+ vec![]
+ ))
+ .expect("request should parse to a query"),
+ Query {
+ query: "b/42".to_string(),
+ cs: false,
+ },
+ );
+ }
}
--
cgit 1.4.1