diff options
| author | Ben Busby <contact@benbusby.com> | 2022-01-27 11:57:41 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-27 11:57:41 -0700 |
| commit | 932f3bbcab9be82aafb487d7890fde83b2210a7b (patch) | |
| tree | 4261df31d3964475057a6139908ce96ad87592b5 | |
| parent | 724a995fd9263194b255b82c68a48b5b6e735e30 (diff) | |
| download | farside-932f3bbcab9be82aafb487d7890fde83b2210a7b.tar.gz | |
Preserve redirect with `/_/` path prefix (#13)
This adds a straightforward way of preserving Farside's redirecting
behavior in the user's browser history. That way if an instance becomes
unavailable between the 5 min scans, the user can opt to navigate back
one page and be taken to a new instance.
This is accomplished using a single line of JS, and could potentially
work as the default behavior of Farside (with the current default
behavior requiring a path prefix instead). This should be revisited down
the road when more people are using this service.
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | README.md | 7 | ||||
| -rw-r--r-- | config/config.exs | 1 | ||||
| -rw-r--r-- | lib/farside/router.ex | 14 | ||||
| -rw-r--r-- | route.eex | 10 |
5 files changed, 34 insertions, 0 deletions
@@ -11,3 +11,5 @@ erl_crash.dump # Ignore results from update script .update-result* + +*.rdb @@ -55,6 +55,13 @@ Farside's routing is very minimal, with only the following routes: URL>/r/popular` - Note that a path is not required. `/libreddit` for example will still redirect the user to a working libreddit instance +- `/_/:service/*glob` + - Achieves the same redirect as the main `/:service/*glob` endpoint, but + preserves a short landing page in the browser's history to allow quickly + jumping between instances by navigating back. + - Ex: `/_/nitter` -> nitter instance A -> (navigate back one page) -> nitter + instance B -> ... + - *Note: Uses Javascript to preserve the page in history* When a service is requested with the `/:service/...` endpoint, Farside requests the list of working instances from Redis and returns a random one from the list diff --git a/config/config.exs b/config/config.exs index 1c393cd..982990c 100644 --- a/config/config.exs +++ b/config/config.exs @@ -9,6 +9,7 @@ config :farside, previous_suffix: "-previous", services_json: "services.json", index: "index.eex", + route: "route.eex", headers: [ {"User-Agent", "Mozilla/5.0 (Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0"}, {"Accept", "text/html"}, diff --git a/lib/farside/router.ex b/lib/farside/router.ex index e74f29e..2f0216c 100644 --- a/lib/farside/router.ex +++ b/lib/farside/router.ex @@ -1,5 +1,6 @@ defmodule Farside.Router do @index Application.fetch_env!(:farside, :index) + @route Application.fetch_env!(:farside, :route) use Plug.Router @@ -24,6 +25,19 @@ defmodule Farside.Router do send_resp(conn, 200, resp) end + get "/_/:service/*glob" do + r_path = String.slice(conn.request_path, 2..-1) + + resp = + EEx.eval_file( + @route, + service: service, + instance_url: r_path + ) + + send_resp(conn, 200, resp) + end + get "/:service/*glob" do path = Enum.join(glob, "/") instance = Farside.pick_instance(service) diff --git a/route.eex b/route.eex new file mode 100644 index 0000000..a06a265 --- /dev/null +++ b/route.eex @@ -0,0 +1,10 @@ +<head> + <title>Farside Redirect - <%= service %></title> + <meta http-equiv="refresh" content="1; url=<%= instance_url %>"> + <script> + history.pushState({page: 1}, "Farside Redirect"); + </script> +</head> +<body> + <span>Redirecting to <%= service %> instance... +</body> |
