➕ Add asset_root option
							parent
							
								
									3293b3e7f9
								
							
						
					
					
						commit
						b32990a6bb
					
				|  | @ -108,7 +108,7 @@ async fn main () -> Result <(), Box <dyn Error>> { | ||||||
| 	
 | 	
 | ||||||
| 	let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); | 	let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); | ||||||
| 	
 | 	
 | ||||||
| 	let handlebars = file_server::load_templates ()?; | 	let handlebars = file_server::load_templates (&PathBuf::new ())?; | ||||||
| 	
 | 	
 | ||||||
| 	let state = Arc::new (ServerState { | 	let state = Arc::new (ServerState { | ||||||
| 		config: Config { | 		config: Config { | ||||||
|  |  | ||||||
|  | @ -14,13 +14,16 @@ struct Opt { | ||||||
| 	
 | 	
 | ||||||
| 	#[structopt (long)] | 	#[structopt (long)] | ||||||
| 	config_path: Option <PathBuf>, | 	config_path: Option <PathBuf>, | ||||||
|  | 	
 | ||||||
|  | 	#[structopt (long)] | ||||||
|  | 	asset_root: Option <PathBuf>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn main () -> Result <(), Box <dyn Error>> { | fn main () -> Result <(), Box <dyn Error>> { | ||||||
| 	let opt = Opt::from_args (); | 	let opt = Opt::from_args (); | ||||||
| 	
 | 	
 | ||||||
| 	tracing_subscriber::fmt::init (); | 	tracing_subscriber::fmt::init (); | ||||||
| 	let path = opt.config_path.unwrap_or_else (|| PathBuf::from ("./config/ptth_server.toml")); | 	let path = opt.config_path.clone ().unwrap_or_else (|| PathBuf::from ("./config/ptth_server.toml")); | ||||||
| 	let config_file: ptth::server::ConfigFile = ptth::load_toml::load (&path); | 	let config_file: ptth::server::ConfigFile = ptth::load_toml::load (&path); | ||||||
| 	
 | 	
 | ||||||
| 	let mut rt = if false { | 	let mut rt = if false { | ||||||
|  | @ -37,11 +40,12 @@ fn main () -> Result <(), Box <dyn Error>> { | ||||||
| 		runtime::Runtime::new ()? | 		runtime::Runtime::new ()? | ||||||
| 	}; | 	}; | ||||||
| 	
 | 	
 | ||||||
| 	rt.block_on (async { | 	rt.block_on (async move { | ||||||
| 		ptth::server::run_server ( | 		ptth::server::run_server ( | ||||||
| 			config_file, 
 | 			config_file, 
 | ||||||
| 			ptth::graceful_shutdown::init (), | 			ptth::graceful_shutdown::init (), | ||||||
| 			Some (path) | 			Some (path), | ||||||
|  | 			opt.asset_root | ||||||
| 		).await | 		).await | ||||||
| 	})?; | 	})?; | ||||||
| 	
 | 	
 | ||||||
|  |  | ||||||
|  | @ -133,7 +133,7 @@ mod tests { | ||||||
| 			let (stop_server_tx, stop_server_rx) = oneshot::channel (); | 			let (stop_server_tx, stop_server_rx) = oneshot::channel (); | ||||||
| 			let task_server = { | 			let task_server = { | ||||||
| 				spawn (async move { | 				spawn (async move { | ||||||
| 					server::run_server (config_file, stop_server_rx, None).await.unwrap (); | 					server::run_server (config_file, stop_server_rx, None, None).await.unwrap (); | ||||||
| 				}) | 				}) | ||||||
| 			}; | 			}; | ||||||
| 			
 | 			
 | ||||||
|  |  | ||||||
|  | @ -147,7 +147,7 @@ impl From <&ConfigFile> for RelayState { | ||||||
| 		
 | 		
 | ||||||
| 		Self { | 		Self { | ||||||
| 			config: Config::from (config_file), | 			config: Config::from (config_file), | ||||||
| 			handlebars: Arc::new (load_templates ().unwrap ()), | 			handlebars: Arc::new (load_templates (&PathBuf::new ()).unwrap ()), | ||||||
| 			request_rendezvous: Default::default (), | 			request_rendezvous: Default::default (), | ||||||
| 			response_rendezvous: Default::default (), | 			response_rendezvous: Default::default (), | ||||||
| 			shutdown_watch_tx, | 			shutdown_watch_tx, | ||||||
|  | @ -539,17 +539,21 @@ async fn handle_all (req: Request <Body>, state: Arc <RelayState>) | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn load_templates () 
 | use std::path::{Path, PathBuf}; | ||||||
|  | 
 | ||||||
|  | pub fn load_templates (asset_root: &Path) 
 | ||||||
| -> Result <Handlebars <'static>, Box <dyn Error>> | -> Result <Handlebars <'static>, Box <dyn Error>> | ||||||
| { | { | ||||||
| 	let mut handlebars = Handlebars::new (); | 	let mut handlebars = Handlebars::new (); | ||||||
| 	handlebars.set_strict_mode (true); | 	handlebars.set_strict_mode (true); | ||||||
| 	
 | 	
 | ||||||
|  | 	let asset_root = asset_root.join ("handlebars/relay"); | ||||||
|  | 	
 | ||||||
| 	for (k, v) in vec! [ | 	for (k, v) in vec! [ | ||||||
| 		("relay_server_list", "relay_server_list.html"), | 		("relay_server_list", "relay_server_list.html"), | ||||||
| 		("relay_root", "relay_root.html"), | 		("relay_root", "relay_root.html"), | ||||||
| 	].into_iter () { | 	].into_iter () { | ||||||
| 		handlebars.register_template_file (k, format! ("ptth_handlebars/{}", v))?; | 		handlebars.register_template_file (k, &asset_root.join (v))?; | ||||||
| 	} | 	} | ||||||
| 	
 | 	
 | ||||||
| 	Ok (handlebars) | 	Ok (handlebars) | ||||||
|  |  | ||||||
|  | @ -381,7 +381,7 @@ fn serve_307 (location: String) -> Response { | ||||||
| 	resp | 	resp | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn render_markdown (bytes: &[u8]) -> Result <String, MarkdownError> { | fn render_markdown (bytes: &[u8], out: &mut String) -> Result <(), MarkdownError> { | ||||||
| 	use pulldown_cmark::{Parser, Options, html}; | 	use pulldown_cmark::{Parser, Options, html}; | ||||||
| 	
 | 	
 | ||||||
| 	let markdown_input = match std::str::from_utf8 (bytes) { | 	let markdown_input = match std::str::from_utf8 (bytes) { | ||||||
|  | @ -393,11 +393,17 @@ fn render_markdown (bytes: &[u8]) -> Result <String, MarkdownError> { | ||||||
| 	options.insert (Options::ENABLE_STRIKETHROUGH); | 	options.insert (Options::ENABLE_STRIKETHROUGH); | ||||||
| 	let parser = Parser::new_ext (markdown_input, options); | 	let parser = Parser::new_ext (markdown_input, options); | ||||||
| 	
 | 	
 | ||||||
|  | 	html::push_html (out, parser); | ||||||
|  | 	
 | ||||||
|  | 	Ok (()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn render_markdown_styled (bytes: &[u8]) -> Result <String, MarkdownError> { | ||||||
| 	// Write to String buffer.
 | 	// Write to String buffer.
 | ||||||
| 	let mut out = String::new (); | 	let mut out = String::new (); | ||||||
| 	
 | 	
 | ||||||
| 	out.push_str ("<body style=\"font-family: sans-serif;\">"); | 	out.push_str ("<body style=\"font-family: sans-serif;\">"); | ||||||
| 	html::push_html (&mut out, parser); | 	render_markdown (bytes, &mut out)?; | ||||||
| 	out.push_str ("</body>"); | 	out.push_str ("</body>"); | ||||||
| 	
 | 	
 | ||||||
| 	Ok (out) | 	Ok (out) | ||||||
|  | @ -543,7 +549,7 @@ async fn internal_serve_all ( | ||||||
| 						let bytes_read = file.read (&mut buffer).await.unwrap (); | 						let bytes_read = file.read (&mut buffer).await.unwrap (); | ||||||
| 						buffer.truncate (bytes_read); | 						buffer.truncate (bytes_read); | ||||||
| 						
 | 						
 | ||||||
| 						MarkdownPreview (render_markdown (&buffer).unwrap ()) | 						MarkdownPreview (render_markdown_styled (&buffer).unwrap ()) | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 				else { | 				else { | ||||||
|  | @ -628,17 +634,21 @@ pub async fn serve_all ( | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn load_templates () 
 | pub fn load_templates ( | ||||||
|  | 	asset_root: &Path | ||||||
|  | ) 
 | ||||||
| -> Result <Handlebars <'static>, Box <dyn Error>> | -> Result <Handlebars <'static>, Box <dyn Error>> | ||||||
| { | { | ||||||
| 	let mut handlebars = Handlebars::new (); | 	let mut handlebars = Handlebars::new (); | ||||||
| 	handlebars.set_strict_mode (true); | 	handlebars.set_strict_mode (true); | ||||||
| 	
 | 	
 | ||||||
|  | 	let asset_root = asset_root.join ("handlebars/server"); | ||||||
|  | 	
 | ||||||
| 	for (k, v) in vec! [ | 	for (k, v) in vec! [ | ||||||
| 		("file_server_dir", "file_server_dir.html"), | 		("file_server_dir", "file_server_dir.html"), | ||||||
| 		("file_server_root", "file_server_root.html"), | 		("file_server_root", "file_server_root.html"), | ||||||
| 	].into_iter () { | 	].into_iter () { | ||||||
| 		handlebars.register_template_file (k, format! ("ptth_handlebars/{}", v))?; | 		handlebars.register_template_file (k, asset_root.join (v))?; | ||||||
| 	} | 	} | ||||||
| 	
 | 	
 | ||||||
| 	Ok (handlebars) | 	Ok (handlebars) | ||||||
|  | @ -770,7 +780,7 @@ mod tests { | ||||||
| 		let mut rt = Runtime::new ().unwrap (); | 		let mut rt = Runtime::new ().unwrap (); | ||||||
| 		
 | 		
 | ||||||
| 		rt.block_on (async { | 		rt.block_on (async { | ||||||
| 			let handlebars = load_templates ().unwrap (); | 			let handlebars = load_templates (&PathBuf::new ()).unwrap (); | ||||||
| 			let server_info = ServerInfo { | 			let server_info = ServerInfo { | ||||||
| 				server_name: "PTTH File Server".to_string (), | 				server_name: "PTTH File Server".to_string (), | ||||||
| 			}; | 			}; | ||||||
|  | @ -879,7 +889,9 @@ mod tests { | ||||||
| 				"<p>Hello world, this is a <del>complicated</del> <em>very simple</em> example.</p>\n" | 				"<p>Hello world, this is a <del>complicated</del> <em>very simple</em> example.</p>\n" | ||||||
| 			), | 			), | ||||||
| 		].into_iter () { | 		].into_iter () { | ||||||
| 			assert_eq! (expected, &render_markdown (input.as_bytes ()).unwrap ()); | 			let mut out = String::default (); | ||||||
|  | 			render_markdown (input.as_bytes (), &mut out).unwrap (); | ||||||
|  | 			assert_eq! (expected, &out); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -128,10 +128,13 @@ pub struct Config { | ||||||
| pub async fn run_server ( | pub async fn run_server ( | ||||||
| 	config_file: ConfigFile, | 	config_file: ConfigFile, | ||||||
| 	shutdown_oneshot: oneshot::Receiver <()>, | 	shutdown_oneshot: oneshot::Receiver <()>, | ||||||
| 	hidden_path: Option <PathBuf> | 	hidden_path: Option <PathBuf>, | ||||||
|  | 	asset_root: Option <PathBuf> | ||||||
| ) | ) | ||||||
| -> Result <(), Box <dyn Error>> 
 | -> Result <(), Box <dyn Error>> 
 | ||||||
| { | { | ||||||
|  | 	let asset_root = asset_root.unwrap_or_else (|| PathBuf::new ()); | ||||||
|  | 	
 | ||||||
| 	use std::convert::TryInto; | 	use std::convert::TryInto; | ||||||
| 	
 | 	
 | ||||||
| 	if crate::password_is_bad (config_file.api_key.clone ()) { | 	if crate::password_is_bad (config_file.api_key.clone ()) { | ||||||
|  | @ -154,7 +157,7 @@ pub async fn run_server ( | ||||||
| 	.default_headers (headers) | 	.default_headers (headers) | ||||||
| 	.timeout (Duration::from_secs (40)) | 	.timeout (Duration::from_secs (40)) | ||||||
| 	.build ().unwrap (); | 	.build ().unwrap (); | ||||||
| 	let handlebars = file_server::load_templates ()?; | 	let handlebars = file_server::load_templates (&asset_root).expect ("Can't load Handlebars templates"); | ||||||
| 	
 | 	
 | ||||||
| 	let state = Arc::new (ServerState { | 	let state = Arc::new (ServerState { | ||||||
| 		config: Config { | 		config: Config { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 _
						_