Skip to content

Commit dd0a736

Browse files
committed
FEAT: Webtransport
1 parent 39af73d commit dd0a736

1 file changed

Lines changed: 78 additions & 32 deletions

File tree

src/quic/mod.rs

Lines changed: 78 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
use quiche::Config;
2+
use quiche::ConnectionId;
3+
use quiche::RecvInfo;
4+
use std::collections::HashMap;
5+
use std::error::Error;
6+
use std::net::SocketAddr;
27
use tokio::net::UdpSocket;
3-
use std::{error::Error, net::SocketAddr};
48

59
pub async fn start_webtransport() -> Result<(), Box<dyn Error>> {
610
let server_addr: SocketAddr = "0.0.0.0:4433".parse().unwrap();
7-
8-
11+
12+
// Configuration de Quiche
913
let mut config = Config::new(quiche::PROTOCOL_VERSION).unwrap();
10-
11-
config.set_application_protos(&[b"webtransport"]).unwrap();
12-
14+
config.set_application_protos(&[b"h3"]).unwrap();
15+
config.set_initial_max_data(10_000_000);
16+
config.set_initial_max_stream_data_bidi_local(1_000_000);
17+
config.set_initial_max_stream_data_bidi_remote(1_000_000);
18+
config.set_initial_max_streams_bidi(100);
19+
1320
config
1421
.load_cert_chain_from_pem_file("localhost.pem")
1522
.unwrap();
@@ -18,40 +25,79 @@ pub async fn start_webtransport() -> Result<(), Box<dyn Error>> {
1825
.unwrap();
1926
config.verify_peer(false);
2027

28+
// Création du socket UDP
2129
let socket = UdpSocket::bind(&server_addr).await.unwrap();
22-
30+
println!("Serveur en écoute sur {}", server_addr);
31+
32+
let mut connections: HashMap<ConnectionId, quiche::Connection> = HashMap::new();
2333
let mut buf = [0; 65535];
24-
34+
2535
loop {
36+
// Recevoir des données du socket
2637
let (read, from) = socket.recv_from(&mut buf).await?;
27-
println!("Received {} bytes", read);
28-
29-
let scid = quiche::ConnectionId::from_vec(vec![0; quiche::MAX_CONN_ID_LEN]);
30-
31-
let mut conn = match quiche::accept(&scid, None, server_addr, from, &mut config) {
32-
Ok(conn) => conn,
38+
println!("Reçu {} bytes de {}", read, from);
39+
40+
// Identifier la connexion
41+
let scid = ConnectionId::from_ref(&buf[..quiche::MAX_CONN_ID_LEN].to_vec());
42+
43+
// Accepter ou récupérer la connexion
44+
let conn = connections.entry(scid.clone()).or_insert_with(|| {
45+
quiche::accept(&scid, None, server_addr, from, &mut config).unwrap()
46+
});
47+
48+
let recv_info = RecvInfo { from, to: server_addr };
49+
50+
// Traiter les données reçues
51+
match conn.recv(&mut buf[..read], recv_info) {
52+
Ok(_) => {
53+
// Traiter les événements de la connexion
54+
process_connection(conn, &socket).await?;
55+
}
3356
Err(e) => {
34-
eprintln!("Failed to accept connection: {:?}", e);
57+
eprintln!("Erreur lors de la réception des données: {:?}", e);
3558
continue;
3659
}
37-
};
38-
39-
println!("New connection: {:?}", read);
40-
41-
let recv_info = quiche::RecvInfo { from, to: server_addr };
42-
43-
if let Err(e) = conn.recv(&mut buf[..read], recv_info) {
44-
eprintln!("Failed to parse packet: {:?}", e);
45-
continue;
4660
}
47-
48-
let mut stream_buf = [0; 1024];
49-
while let Ok((stream_id, _)) = conn.stream_recv(0, &mut stream_buf) {
50-
let message = String::from_utf8_lossy(&stream_buf[..read]);
51-
println!("Received message on stream {}: {}", stream_id, message);
52-
53-
let response = b"Hello, World!";
54-
conn.stream_send(stream_id.try_into().unwrap(), response, true).unwrap();
61+
}
62+
}
63+
64+
async fn process_connection(conn: &mut quiche::Connection, socket: &UdpSocket) -> Result<(), Box<dyn Error>> {
65+
// Lire les données des flux
66+
for stream_id in conn.readable() {
67+
let mut buf = [0; 1024];
68+
match conn.stream_recv(stream_id, &mut buf) {
69+
Ok((len, _)) => {
70+
if len > 0 {
71+
let message = String::from_utf8_lossy(&buf[..len]);
72+
println!("Message reçu sur le flux {} : {}", stream_id, message);
73+
74+
// Répondre au client
75+
let response = format!("Réponse du serveur : {}", message);
76+
conn.stream_send(stream_id, response.as_bytes(), true)?;
77+
}
78+
}
79+
Err(quiche::Error::Done) => break,
80+
Err(e) => {
81+
eprintln!("Erreur lors de la lecture du flux : {:?}", e);
82+
break;
83+
}
5584
}
5685
}
86+
87+
// Envoyer les données en attente
88+
let mut out_buf = [0; 65535];
89+
loop {
90+
let (len, send_info) = match conn.send(&mut out_buf) {
91+
Ok(v) => v,
92+
Err(quiche::Error::Done) => break,
93+
Err(e) => {
94+
eprintln!("Erreur lors de l'envoi des données: {:?}", e);
95+
break;
96+
}
97+
};
98+
99+
socket.send_to(&out_buf[..len], send_info.to).await?;
100+
}
101+
102+
Ok(())
57103
}

0 commit comments

Comments
 (0)