ルーティングが一つの場合、TcpListener::bindでlistenerを作ってあげれば良い
ただ、フレームワークの場合、ルーティングが複数でないと意味がない…
use std::fs;
use std::io;
use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};
fn main() {
let path = "./data/index.html";
let listenr = TcpListener::bind("192.168.33.10:8000").unwrap();
println!("Listening on http://192.168.33.10:8000");
for stream in listenr.incoming() {
match stream {
Ok(stream) => {
let _ = handle_connection(stream, path);
}
Err(e) => {
println!("Connection failed: {}", e);
}
}
}
}
fn handle_connection(mut stream: TcpStream, path: &str) -> io::Result<()> {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let request = String::from_utf8_lossy(&buffer);
println!("Received request:\n{}", request);
let header = "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=UTF-8\r\n\r\n";
let contents = fs::read_to_string(path)?;
println!("File contents:\n{}", contents);
let response = format!("{}{}", header, contents);
stream.write_all(response.as_bytes()).unwrap();
stream.flush().unwrap();
Ok(())
}
index.html
<p>This is framework!</p>
### ルーティングが複数の場合
use std::fs;
use std::io;
use std::io::prelude::*;
use std::net::{TcpListener, TcpStream};
fn main() {
let path = "./data/index.html";
let listenr = TcpListener::bind("192.168.33.10:8000").unwrap();
println!("Listening on http://192.168.33.10:8000");
for stream in listenr.incoming() {
match stream {
Ok(stream) => {
let _ = handle_connection(stream);
}
Err(e) => {
println!("Connection failed: {}", e);
}
}
}
}
fn handle_connection(mut stream: TcpStream) {
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let request = String::from_utf8_lossy(&buffer);
println!("Received request:\n{}", request);
let response = if request.starts_with("GET /hello ") {
http_response(200, "text/html", "<h1>Hello from Rust!</h1>")
} else if request.starts_with("GET / ") {
http_response(200, "text/html", "<h1>Welcome to the Rust server!</h1>")
} else {
http_response(404, "text/html", "<h1>404 Not Found</h1>")
};
stream.write_all(response.as_bytes()).unwrap();
stream.flush().unwrap();
}
fn http_response(status_code: u16, content_type: &str, body: &str) -> String {
format!(
"HTTP/1.1 {} {}\r\nContent-Type: {}\r\nContent-Length: {}\r\n\r\n{}",
status_code,
get_status_text(status_code),
content_type,
body.len(),
body
)
}
fn get_status_text(code: u16) -> &'static str {
match code {
200 => "OK",
404 => "Not Found",
_ => "Unknown",
}
}
ルートとコンテンツをhashmapにした場合
let mut buffer = [0; 1024];
stream.read(&mut buffer).unwrap();
let request = String::from_utf8_lossy(&buffer);
let request_line = request.lines().next().unwrap_or("");
println!("Received request:\n{}", request);
let mut routes = HashMap::new();
routes.insert (
"/hello",
"<h1>Hello from Rust!</h1>",
);
routes.insert (
"/",
"<h1>Welcome to the Rust server!</h1>",
);
let path = request_line
.split_whitespace()
.nth(1)
.unwrap_or("/");
let response_body = routes.get(path)
.cloned()
.unwrap_or_else(|| "<h1>404 Not Found</h1>");
let response = http_response(200, "text/html", &response_body);