From 653b41a67f8a0ea60d309a27cd0900cabdcfe9d7 Mon Sep 17 00:00:00 2001 From: Ivan Bushchik Date: Sun, 21 Jan 2024 08:36:30 +0300 Subject: [PATCH] 0.6.1: Add "html" alias type, fix --alias-file Signed-off-by: Ivan Bushchik --- Cargo.toml | 2 +- README.md | 1 + alias.json | 4 ++-- src/main.rs | 46 ++++++++++++++++++++++++++++------------------ src/structs.rs | 5 ++++- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cfd813e..7f5cdd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "urouter" -version = "0.6.0" +version = "0.6.1" edition = "2021" license = "MIT" repository = "https://github.com/ivabus/urouter" diff --git a/README.md b/README.md index 10749d4..84f1a33 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Each set contains 2 necessary elements and 1 optional. - `url` (string) - redirect to URL with HTTP 303 See Other - `file` (string) - read file from path `--dir/file` where `--dir` is option (default: `.`, see `--help`) and respond with HTTP 200 OK with `content-type: text/plain` - `text` (string) - plain text with HTTP 200 OK with `content-type: text/plain` + - `html` (string) - plain text with HTTP 200 OK with `content-type: text/html` - `external` (set) - download (every time) file using `ureq` HTTP library and response with contents of downloaded resource with HTTP 200 OK and extracted `content-type` from response - `url` (string) - URL to download - `headers` (set, optional) - headers to include with request diff --git a/alias.json b/alias.json index a72ec4b..51fa002 100644 --- a/alias.json +++ b/alias.json @@ -17,7 +17,7 @@ { "uri":"text", "alias": { - "text": "sometext" + "html": "sometext" }, "agent": { "regex": "^curl/[0-9].[0-9].[0-9]$", @@ -35,4 +35,4 @@ } } } -] \ No newline at end of file +] diff --git a/src/main.rs b/src/main.rs index ae66225..5212c75 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use structs::*; extern crate rocket; use rocket::http::{ContentType, Status}; +use std::io::Write; use std::{ cell::OnceCell, collections::HashMap, hint::unreachable_unchecked, path::PathBuf, time::Instant, }; @@ -24,6 +25,7 @@ use rocket::{ use clap::Parser; use regex::Regex; +use rocket::response::content::RawHtml; static mut ALIAS: OnceCell> = OnceCell::new(); static mut COMPILED_REGEXES: OnceCell> = OnceCell::new(); @@ -38,6 +40,7 @@ fn get_return(alias: &Alias) -> Response { Response::Text(Box::new(RawText(smurf::io::read_file_str(&dir).unwrap()))) } AliasType::Text(text) => Response::Text(Box::new(RawText(text.clone()))), + AliasType::Html(html) => Response::Html(Box::new(RawHtml(html.clone()))), AliasType::External(source) => { let mut request = ureq::get(&source.url); for (header, value) in &source.headers { @@ -95,27 +98,34 @@ async fn index(user_agent: UserAgent) -> Response { get_page("/", user_agent) } +fn get_config_file_location() -> PathBuf { + if users::get_effective_uid() == 0 { + return "/etc/urouter/alias.json".parse().unwrap(); + } + + if let Ok(config_home) = std::env::var("XDG_CONFIG_HOME") { + return format!("{}/urouter/alias.json", config_home).parse().unwrap(); + } + + if let Ok(home) = std::env::var("HOME") { + return format!("{}/.config/urouter/alias.json", home).parse().unwrap(); + } + + if !std::path::Path::new("alias.json").exists() { + let mut file = std::fs::File::create("alias.json").unwrap(); + file.write_all(b"[]").unwrap(); + } + "alias.json".parse().unwrap() +} + #[rocket::main] async fn main() -> Result<(), rocket::Error> { let mut args = Args::parse(); - args.alias_file = match args.alias_file { - Some(f) => Some(f), - None => Some( - match users::get_effective_uid() { - 0 => "/etc/urouter/alias.json".to_string(), - _ => match std::env::var("XDG_CONFIG_HOME") { - Ok(config_home) => format!("{}/urouter/alias.json", config_home), - Err(_) => match std::env::var("HOME") { - Ok(home) => format!("{}/.config/urouter/alias.json", home), - Err(_) => { - panic!("Could not get config location, see README") - } - }, - }, - } - .into(), - ), - }; + + if args.alias_file.is_none() { + args.alias_file = Some(get_config_file_location()); + } + let file = std::fs::File::open(args.alias_file.unwrap()).unwrap(); let alias: Vec = if args.alias_file_is_set_not_a_list { serde_json::from_reader::(file).unwrap().alias diff --git a/src/structs.rs b/src/structs.rs index 33f1319..858e703 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -3,7 +3,7 @@ use clap::Parser; use rocket::http::{ContentType, Status}; use rocket::request::{FromRequest, Outcome}; -use rocket::response::content::RawText; +use rocket::response::content::{RawHtml, RawText}; use rocket::response::{Redirect, Responder}; use rocket::Request; use serde::Deserialize; @@ -53,6 +53,8 @@ pub enum AliasType { File(String), #[serde(alias = "text")] Text(String), + #[serde(alias = "html")] + Html(String), #[serde(alias = "external")] External(External), } @@ -73,6 +75,7 @@ pub struct External { #[derive(Responder)] pub enum Response { Text(Box>), + Html(Box>), Redirect(Box), Status(Status), Custom(Box<(ContentType, RawText)>),