forceful server shutdown

This commit is contained in:
2025-03-13 16:15:05 +01:00
parent 0242b29f3c
commit fa0d511bd6
4 changed files with 49 additions and 6 deletions

30
Cargo.lock generated
View File

@ -1,7 +1,35 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "http_server"
version = "0.1.0"
dependencies = [
"signal-hook",
]
[[package]]
name = "libc"
version = "0.2.171"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6"
[[package]]
name = "signal-hook"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
dependencies = [
"libc",
"signal-hook-registry",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]

View File

@ -4,4 +4,4 @@ version = "0.1.0"
edition = "2021"
[dependencies]
signal-hook = "0.3.17"

View File

@ -8,7 +8,7 @@ services:
container_name: http-server
build: .
image: http-server:latest
restart: no
restart: always
ports:
- 80:8080
networks:

View File

@ -1,7 +1,11 @@
use signal_hook::{consts::*, iterator::Signals};
use std::{
collections::HashMap,
error::Error,
io::{BufRead, BufReader, Write},
net::{TcpListener, TcpStream},
process::exit,
thread,
};
#[derive(PartialEq, Eq, Debug)]
@ -342,18 +346,29 @@ fn handle_request(mut stream: TcpStream) {
// TODO: Act upon the request
stream
.write_all(b"HTTP/1.1 200 OK\r\n\r\nThis is the server speaking\r\n")
.write_all(b"HTTP/1.1 200 OK\r\n\r\nHello, World!\r\n")
.unwrap();
}
fn main() -> Result<(), std::io::Error> {
fn main() -> Result<(), Box<dyn Error>> {
let mut signals = Signals::new([SIGINT, SIGTERM])?;
// TODO: Gracefully shutdown server
thread::spawn(move || {
for sig in signals.forever() {
println!("Received signal {:?}", sig);
println!("Shutting down");
exit(1);
}
});
let listener = TcpListener::bind("0.0.0.0:8080")?;
println!("Server started");
for stream in listener.incoming() {
let stream = stream?;
handle_request(stream)
handle_request(stream);
}
Ok(())
}