this is my http/3 server code
[package]
name = "http3_server"
version = "0.1.0"
edition = "2024"
[dependencies]
bytes = "1.10.1"
h3 = "0.0.6"
h3-quinn = "0.0.7"
http = "1.2.0"
quinn = "0.11.6"
rustls = "0.23.23"
rustls-pemfile = "2.2.0"
tokio = { version = "1.43.0", features = ["full"] }
use std::{error::Error, fs::File, io::BufReader};
use h3::server::Connection;
use quinn::{Endpoint, ServerConfig};
use rustls::pki_types::{PrivateKeyDer, pem::PemObject};
use rustls_pemfile::certs;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let addr = "[::1]:3000".parse()?;
let server_config = load_server_config()?;
let server = Endpoint::server(server_config, addr)?;
while let Some(incoming) = server.accept().await {
let incoming = incoming.await?;
println!("{:#?}", incoming.remote_address());
// ε€η QUIC θΏζ₯
let task = async move {
let h3_conn = h3_quinn::Connection::new(incoming);
let mut h3_conn = Connection::new(h3_conn).await.unwrap();
while let Some((_req, mut stream)) = h3_conn.accept().await.unwrap() {
let response = http::Response::builder().status(200).body(()).unwrap();
stream.send_response(response).await.unwrap();
let data = bytes::Bytes::from_static(&b"Hello from HTTP/3!"[..]);
stream.send_data(data).await.unwrap();
stream.finish().await.unwrap();
}
};
tokio::spawn(task);
}
Ok(())
}
fn load_server_config() -> Result<ServerConfig, Box<dyn Error>> {
let mut cert_file = BufReader::new(File::open("cert.pem")?);
let key_file = BufReader::new(File::open("key.pem")?);
let cert_chain: Vec<_> = certs(&mut cert_file).collect::<Result<Vec<_>, _>>()?;
let key = PrivateKeyDer::from_pem_reader(key_file)?;
Ok(ServerConfig::with_single_cert(cert_chain, key)?)
}