From 5f0d70011aea73b633f97dfc220d2018c80b13bd Mon Sep 17 00:00:00 2001 From: Snorre Ettrup Altschul Date: Tue, 1 Apr 2025 21:56:55 +0200 Subject: [PATCH] removed all posts --- public/index.html | 11 +++- public/js/code_highlighter.js | 5 ++ .../post.md | 0 .../openbirch.png | Bin .../post.md | 0 .../thumbnail.png | Bin .../hibernating.png | Bin .../ping.png | Bin 0 -> 44328 bytes .../post.md | 61 +++++++++++++++++- .../starting.png | Bin .../thumbnail.png | Bin src/main.rs | 8 +-- 12 files changed, 78 insertions(+), 7 deletions(-) rename public/posts/{I hate github & forgejo actions => _I hate github & forgejo actions}/post.md (100%) rename public/posts/{My language is 700x slower than python => _My language is 700x slower than python}/openbirch.png (100%) rename public/posts/{My language is 700x slower than python => _My language is 700x slower than python}/post.md (100%) rename public/posts/{My language is 700x slower than python => _My language is 700x slower than python}/thumbnail.png (100%) rename public/posts/{Putting hungry minecraft servers to sleep => _Putting hungry minecraft servers to sleep}/hibernating.png (100%) create mode 100644 public/posts/_Putting hungry minecraft servers to sleep/ping.png rename public/posts/{Putting hungry minecraft servers to sleep => _Putting hungry minecraft servers to sleep}/post.md (72%) rename public/posts/{Putting hungry minecraft servers to sleep => _Putting hungry minecraft servers to sleep}/starting.png (100%) rename public/posts/{Putting hungry minecraft servers to sleep => _Putting hungry minecraft servers to sleep}/thumbnail.png (100%) diff --git a/public/index.html b/public/index.html index f2b05b5..fbaadad 100644 --- a/public/index.html +++ b/public/index.html @@ -63,7 +63,16 @@ if (response.status != 200) return; - let posts = (await response.text()).split("\n"); + let posts = (await response.text()).split("\n").filter(x => x != ""); + + if (posts.length == 0) { + let p = document.querySelector("#content>.content.posts>h2"); + p.innerHTML = "This is where I would put my posts...
IF I HAD ANY!"; + let elem = document.querySelector("#content>.content.posts>ul"); + elem.remove(); + + return; + } let p = document.querySelector("#content>.content.posts>h2"); p.innerHTML = "Recent posts"; diff --git a/public/js/code_highlighter.js b/public/js/code_highlighter.js index ac2ee26..997e92d 100644 --- a/public/js/code_highlighter.js +++ b/public/js/code_highlighter.js @@ -178,6 +178,8 @@ const maps = { keyword("Ok"), keyword("Err"), keyword("in"), + keyword("Self"), + keyword("mut"), altKeyword("if"), altKeyword("else"), @@ -185,6 +187,9 @@ const maps = { altKeyword("loop"), altKeyword("for"), altKeyword("while"), + altKeyword("return"), + altKeyword("async"), + altKeyword("await"), altKeyword("mod"), altKeyword("use"), diff --git a/public/posts/I hate github & forgejo actions/post.md b/public/posts/_I hate github & forgejo actions/post.md similarity index 100% rename from public/posts/I hate github & forgejo actions/post.md rename to public/posts/_I hate github & forgejo actions/post.md diff --git a/public/posts/My language is 700x slower than python/openbirch.png b/public/posts/_My language is 700x slower than python/openbirch.png similarity index 100% rename from public/posts/My language is 700x slower than python/openbirch.png rename to public/posts/_My language is 700x slower than python/openbirch.png diff --git a/public/posts/My language is 700x slower than python/post.md b/public/posts/_My language is 700x slower than python/post.md similarity index 100% rename from public/posts/My language is 700x slower than python/post.md rename to public/posts/_My language is 700x slower than python/post.md diff --git a/public/posts/My language is 700x slower than python/thumbnail.png b/public/posts/_My language is 700x slower than python/thumbnail.png similarity index 100% rename from public/posts/My language is 700x slower than python/thumbnail.png rename to public/posts/_My language is 700x slower than python/thumbnail.png diff --git a/public/posts/Putting hungry minecraft servers to sleep/hibernating.png b/public/posts/_Putting hungry minecraft servers to sleep/hibernating.png similarity index 100% rename from public/posts/Putting hungry minecraft servers to sleep/hibernating.png rename to public/posts/_Putting hungry minecraft servers to sleep/hibernating.png diff --git a/public/posts/_Putting hungry minecraft servers to sleep/ping.png b/public/posts/_Putting hungry minecraft servers to sleep/ping.png new file mode 100644 index 0000000000000000000000000000000000000000..5f85dd2c797faae29e7314d2ab6b7a22f0cbd65e GIT binary patch literal 44328 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 a;~ZQ3l8ZY`Ert8~?Gminecraft.wiki") ## Detecting the subdomain +The first step in routing the traffic was determining where to send it to. + Luckily for me, the Minecraft procotol sends the full address it is trying to connect to during the handshake. This meant that I simply had to parse the handshake and extract the subdomain from the address, see if it matches any configured server, and then redirect all traffic to the internal port that server runs on. -***code explanation*** +`$ vim protocol/handshake.rs` +```rust +impl Handshake { + pub async fn new(buf: &mut BufferedReader) -> Result { + // Packets start with their type id. The handshake is id 0x00 + if !check_bytes(&[0x00], buf).await? { + return Err(Error::Err( + "Wrong packet type for handshake. Expected {} got {}".into(), + )); + } + buf.read(1).await?; // Consume handhake byte + + let protocol_version = VarInt::read_from(buf).await?; + let address = read_string(buf).await?; + let port = buf.read_u16().await?; + let next_state = VarInt::read_from(buf).await?; + + return Ok( + Self { + protocol_version, + address, + port, + next_state, + }, + ); + } +} +``` + +The only thing I was interrested in was the `address` part of the packet. This is a full string +containing the text the user typed in the `IP Address` field in their client. + +Once I had this it was as simple as splitting by `.` and taking the first result. This "server name" would now be used to look up the corosponding servers information in a table. + +```rust + + let result = Handshake::new(&mut reader).await; + if !result.is_ok() { + return Ok(None); + } + + let handshake = result.ok().unwrap(); + let split = handshake.address.split(".").collect::>(); + let server_name = *split.first().unwrap(); + + if !SERVERS.lock().unwrap().contains_key(server_name) { + println!("Unknown server {}", server_name); + write_unknown_server_status(server_name.into(), &mut reader).await?; + return Ok(None); + } + let mut server_lock = SERVERS.lock().unwrap(); + let server = server_lock.get_mut(server_name).unwrap(); + status = server.status; + port = server.port; + +``` ***show images of hibernation and starting*** diff --git a/public/posts/Putting hungry minecraft servers to sleep/starting.png b/public/posts/_Putting hungry minecraft servers to sleep/starting.png similarity index 100% rename from public/posts/Putting hungry minecraft servers to sleep/starting.png rename to public/posts/_Putting hungry minecraft servers to sleep/starting.png diff --git a/public/posts/Putting hungry minecraft servers to sleep/thumbnail.png b/public/posts/_Putting hungry minecraft servers to sleep/thumbnail.png similarity index 100% rename from public/posts/Putting hungry minecraft servers to sleep/thumbnail.png rename to public/posts/_Putting hungry minecraft servers to sleep/thumbnail.png diff --git a/src/main.rs b/src/main.rs index 20478e5..018fb76 100644 --- a/src/main.rs +++ b/src/main.rs @@ -127,10 +127,10 @@ fn handle_connection(mut stream: TcpStream) { let y = file_name.to_str(); let ft = x.file_type(); if y.is_some() { - if ft.is_ok() && ft.unwrap().is_dir() { - true - } else if y.unwrap().starts_with("_") { + if y.unwrap().starts_with("_") { false + } else if ft.is_ok() && ft.unwrap().is_dir() { + true } else if y.unwrap().ends_with(".md") { true } else { @@ -228,7 +228,7 @@ fn handle_connection(mut stream: TcpStream) { } }) .reduce(|a, b| format!("{}\n{}", b, a)) - .unwrap(); + .unwrap_or("".to_owned()); format!("HTTP/1.1 200 OK\r\nContent-Type: text/text\r\nContent-Length: {}\r\n\r\n{}", data.len(), data) } Err(e) => {