Skip to content

Instantly share code, notes, and snippets.

@mjohnsullivan
Last active March 12, 2024 16:08
Show Gist options
  • Star 61 You must be signed in to star a gist
  • Fork 12 You must be signed in to fork a gist
  • Save mjohnsullivan/e5182707caf0a9dbdf2d to your computer and use it in GitHub Desktop.
Save mjohnsullivan/e5182707caf0a9dbdf2d to your computer and use it in GitHub Desktop.
Simple HTTP server example for Rust
// Updated example from http://rosettacode.org/wiki/Hello_world/Web_server#Rust
// to work with Rust 1.0 beta
use std::net::{TcpStream, TcpListener};
use std::io::{Read, Write};
use std::thread;
fn handle_read(mut stream: &TcpStream) {
let mut buf = [0u8 ;4096];
match stream.read(&mut buf) {
Ok(_) => {
let req_str = String::from_utf8_lossy(&buf);
println!("{}", req_str);
},
Err(e) => println!("Unable to read stream: {}", e),
}
}
fn handle_write(mut stream: TcpStream) {
let response = b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n<html><body>Hello world</body></html>\r\n";
match stream.write(response) {
Ok(_) => println!("Response sent"),
Err(e) => println!("Failed sending response: {}", e),
}
}
fn handle_client(stream: TcpStream) {
handle_read(&stream);
handle_write(stream);
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
println!("Listening for connections on port {}", 8080);
for stream in listener.incoming() {
match stream {
Ok(stream) => {
thread::spawn(|| {
handle_client(stream)
});
}
Err(e) => {
println!("Unable to connect: {}", e);
}
}
}
}
@ndelvalle
Copy link

How can I cleanly shutdown this server TcpListener?

@cezaryB
Copy link

cezaryB commented Apr 12, 2020

Really nice example, thank you

@master-hax
Copy link

great example

Copy link

ghost commented Feb 1, 2023

great works! and great example!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment