Marking known issues and wrapping up dev for the night
							parent
							
								
									49cd292115
								
							
						
					
					
						commit
						116b3b4900
					
				| 
						 | 
					@ -4,6 +4,8 @@ use std::{
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use structopt::StructOpt;
 | 
					use structopt::StructOpt;
 | 
				
			||||||
 | 
					use tokio::runtime;
 | 
				
			||||||
 | 
					use tracing::debug;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive (Debug, StructOpt)]
 | 
					#[derive (Debug, StructOpt)]
 | 
				
			||||||
struct Opt {
 | 
					struct Opt {
 | 
				
			||||||
| 
						 | 
					@ -11,15 +13,32 @@ struct Opt {
 | 
				
			||||||
	file_server_root: Option <PathBuf>,
 | 
						file_server_root: Option <PathBuf>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[tokio::main]
 | 
					fn main () -> Result <(), Box <dyn Error>> {
 | 
				
			||||||
async fn main () -> Result <(), Box <dyn Error>> {
 | 
					 | 
				
			||||||
	tracing_subscriber::fmt::init ();
 | 
						tracing_subscriber::fmt::init ();
 | 
				
			||||||
	let path = PathBuf::from ("./config/ptth_server.toml");
 | 
						let path = PathBuf::from ("./config/ptth_server.toml");
 | 
				
			||||||
	let config_file = ptth::load_toml::load (&path);
 | 
						let config_file: ptth::server::ConfigFile = ptth::load_toml::load (&path);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						let mut rt = if false {
 | 
				
			||||||
 | 
							debug! ("Trying to use less RAM");
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							runtime::Builder::new ()
 | 
				
			||||||
 | 
					        .threaded_scheduler ()
 | 
				
			||||||
 | 
					        .enable_all ()
 | 
				
			||||||
 | 
					        .core_threads (1)
 | 
				
			||||||
 | 
					        .thread_stack_size (1024 * 1024)
 | 
				
			||||||
 | 
					        .build ()?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
							runtime::Runtime::new ()?
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						rt.block_on (async {
 | 
				
			||||||
		ptth::server::run_server (
 | 
							ptth::server::run_server (
 | 
				
			||||||
			config_file, 
 | 
								config_file, 
 | 
				
			||||||
			ptth::graceful_shutdown::init (),
 | 
								ptth::graceful_shutdown::init (),
 | 
				
			||||||
			Some (path)
 | 
								Some (path)
 | 
				
			||||||
		).await
 | 
							).await
 | 
				
			||||||
 | 
						})?;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						Ok (())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,7 +87,7 @@ mod tests {
 | 
				
			||||||
	fn end_to_end () {
 | 
						fn end_to_end () {
 | 
				
			||||||
		use maplit::*;
 | 
							use maplit::*;
 | 
				
			||||||
		use reqwest::Client;
 | 
							use reqwest::Client;
 | 
				
			||||||
		use tracing::{info};
 | 
							use tracing::{debug, info};
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// Prefer this form for tests, since all tests share one process
 | 
							// Prefer this form for tests, since all tests share one process
 | 
				
			||||||
		// and we don't care if another test already installed a subscriber.
 | 
							// and we don't care if another test already installed a subscriber.
 | 
				
			||||||
| 
						 | 
					@ -100,7 +100,7 @@ mod tests {
 | 
				
			||||||
			let server_name = "aliens_wildland";
 | 
								let server_name = "aliens_wildland";
 | 
				
			||||||
			let api_key = "AnacondaHardcoverGrannyUnlatchLankinessMutate";
 | 
								let api_key = "AnacondaHardcoverGrannyUnlatchLankinessMutate";
 | 
				
			||||||
			let tripcode = base64::encode (blake3::hash (api_key.as_bytes ()).as_bytes ());
 | 
								let tripcode = base64::encode (blake3::hash (api_key.as_bytes ()).as_bytes ());
 | 
				
			||||||
			println! ("Relay is expecting tripcode {}", tripcode);
 | 
								debug! ("Relay is expecting tripcode {}", tripcode);
 | 
				
			||||||
			let config_file = relay::ConfigFile {
 | 
								let config_file = relay::ConfigFile {
 | 
				
			||||||
				port: None,
 | 
									port: None,
 | 
				
			||||||
				server_tripcodes: hashmap! {
 | 
									server_tripcodes: hashmap! {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,11 +116,9 @@ impl From <&ConfigFile> for Config {
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			let v = blake3::Hash::from (bytes);
 | 
								let v = blake3::Hash::from (bytes);
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			let k = percent_encoding::percent_encode (k.as_bytes (), percent_encoding::NON_ALPHANUMERIC).to_string ();
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			debug! ("Tripcode {} => {}", k, v.to_hex ());
 | 
								debug! ("Tripcode {} => {}", k, v.to_hex ());
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			(k, v)
 | 
								(k.clone (), v)
 | 
				
			||||||
		}));
 | 
							}));
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		Self {
 | 
							Self {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -292,15 +292,15 @@ async fn serve_file (
 | 
				
			||||||
		None
 | 
							None
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	f.seek (SeekFrom::Start (range.start)).await.unwrap ();
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	info! ("Serving range {}-{}", range.start, range.end);
 | 
						info! ("Serving range {}-{}", range.start, range.end);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	let content_length = range.end - range.start;
 | 
						let content_length = range.end - range.start;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						let seek = SeekFrom::Start (range.start);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	if should_send_body {
 | 
						if should_send_body {
 | 
				
			||||||
		tokio::spawn (async move {
 | 
							tokio::spawn (async move {
 | 
				
			||||||
			//println! ("Opening file {:?}", path);
 | 
								f.seek (seek).await.unwrap ();
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			let mut tx = tx;
 | 
								let mut tx = tx;
 | 
				
			||||||
			let mut bytes_sent = 0;
 | 
								let mut bytes_sent = 0;
 | 
				
			||||||
| 
						 | 
					@ -341,7 +341,6 @@ async fn serve_file (
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	response.header (String::from ("accept-ranges"), b"bytes".to_vec ());
 | 
						response.header (String::from ("accept-ranges"), b"bytes".to_vec ());
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if should_send_body {
 | 
					 | 
				
			||||||
	if range_requested {
 | 
						if range_requested {
 | 
				
			||||||
		response.status_code (StatusCode::PartialContent);
 | 
							response.status_code (StatusCode::PartialContent);
 | 
				
			||||||
		response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", range.start, range.end - 1, range.end).into_bytes ());
 | 
							response.header (String::from ("content-range"), format! ("bytes {}-{}/{}", range.start, range.end - 1, range.end).into_bytes ());
 | 
				
			||||||
| 
						 | 
					@ -351,10 +350,11 @@ async fn serve_file (
 | 
				
			||||||
		response.header (String::from ("content-length"), range.end.to_string ().into_bytes ());
 | 
							response.header (String::from ("content-length"), range.end.to_string ().into_bytes ());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		response.content_length = Some (content_length);
 | 
						if ! should_send_body {
 | 
				
			||||||
 | 
							response.status_code (StatusCode::NoContent);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
		response.status_code (StatusCode::NoContent);
 | 
							response.content_length = Some (content_length);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	if let Some (body) = body {
 | 
						if let Some (body) = body {
 | 
				
			||||||
| 
						 | 
					@ -759,6 +759,21 @@ mod tests {
 | 
				
			||||||
				).await;
 | 
									).await;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				assert_eq! (resp, RangeNotSatisfiable (1_048_576));
 | 
									assert_eq! (resp, RangeNotSatisfiable (1_048_576));
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									let resp = internal_serve_all (
 | 
				
			||||||
 | 
										&file_server_root,
 | 
				
			||||||
 | 
										Method::Head,
 | 
				
			||||||
 | 
										"/files/src/bad_passwords.txt", 
 | 
				
			||||||
 | 
										&headers,
 | 
				
			||||||
 | 
										None
 | 
				
			||||||
 | 
									).await;
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									assert_eq! (resp, ServeFile (ServeFileParams {
 | 
				
			||||||
 | 
										send_body: false,
 | 
				
			||||||
 | 
										range: 0..1_048_576,
 | 
				
			||||||
 | 
										range_requested: false,
 | 
				
			||||||
 | 
										file: AlwaysEqual::testing_blank (),
 | 
				
			||||||
 | 
									}));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								todo.md
								
								
								
								
							
							
						
						
									
										17
									
								
								todo.md
								
								
								
								
							| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
- Not working behind Nginx (Works okay behind Caddy)
 | 
					- Not working behind Nginx (Works okay behind Caddy)
 | 
				
			||||||
- Reduce idle memory use?
 | 
					- Show file server names in HTML
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Impl multi-range / multi-part byte serving
 | 
					- Impl multi-range / multi-part byte serving
 | 
				
			||||||
- Deny unused HTTP methods for endpoints
 | 
					- Deny unused HTTP methods for endpoints
 | 
				
			||||||
| 
						 | 
					@ -43,3 +43,18 @@ https://github.com/rust-lang/rust/issues/65818
 | 
				
			||||||
 | 
					
 | 
				
			||||||
I also considered compressing the passwords file, but I couldn't even get
 | 
					I also considered compressing the passwords file, but I couldn't even get
 | 
				
			||||||
brotli to give it a decent ratio.
 | 
					brotli to give it a decent ratio.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## RAM use is kinda high
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I tried to reduce the thread count in Tokio, but it's still around 12 or 13
 | 
				
			||||||
 | 
					MiB even when the server is doing nothing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I'll leave in the minimize_ram setting for now, but it doesn't actually
 | 
				
			||||||
 | 
					reduce RAM use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Server names can't have spaces
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I tried to figure out the percent encoding and it didn't work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Maybe Base64 would be better or something? At least it's unambiguous and it
 | 
				
			||||||
 | 
					can go straight from UTF-8 to bytes to ASCII-armored.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue