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. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 4
[[package]] [[package]]
name = "http_server" name = "http_server"
version = "0.1.0" 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" edition = "2021"
[dependencies] [dependencies]
signal-hook = "0.3.17"

View File

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

View File

@ -1,7 +1,11 @@
use signal_hook::{consts::*, iterator::Signals};
use std::{ use std::{
collections::HashMap, collections::HashMap,
error::Error,
io::{BufRead, BufReader, Write}, io::{BufRead, BufReader, Write},
net::{TcpListener, TcpStream}, net::{TcpListener, TcpStream},
process::exit,
thread,
}; };
#[derive(PartialEq, Eq, Debug)] #[derive(PartialEq, Eq, Debug)]
@ -342,18 +346,29 @@ fn handle_request(mut stream: TcpStream) {
// TODO: Act upon the request // TODO: Act upon the request
stream 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(); .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")?; let listener = TcpListener::bind("0.0.0.0:8080")?;
println!("Server started"); println!("Server started");
for stream in listener.incoming() { for stream in listener.incoming() {
let stream = stream?; let stream = stream?;
handle_request(stream) handle_request(stream);
} }
Ok(()) Ok(())
} }