mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-15 11:19:07 +02:00
Premier lot de la migration vers Rust. Le binaire loki-rs : - serve : prend le port public (8090), lance `loki web 8091` en écoute locale et lui relaie tout — HTTP, flux SSE trame par trame, WebSocket. Les en-têtes de bout en bout passent intacts (Host, Authorization, Origin, Sec-Fetch-*, X-Forwarded-Proto : le Go en tire ses contrôles d'accès) ; X-Loki-Via entrant est effacé, un client ne doit jamais pouvoir se faire passer pour le tunnel. Go mort : relancé avec attente croissante, 502 lisible entre-temps. - self-update : lit la release « rolling », installe loki et loki-rs dans $LOKI_HOME/bin/<build>/ après vérification SHA-256, bascule par réécriture atomique de release.json. Les versions s'ordonnent par numéro de run CI ; une ABI d'image différente n'est jamais installée. Toute erreur laisse l'état précédent, le démarrage n'est jamais bloqué. Le HTTPS passe par curl (présent dans l'image) : pas de pile TLS ici. - which-bin : dossier d'où l'entrypoint prend les deux binaires, toujours ensemble. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
77 lines
2.5 KiB
Rust
77 lines
2.5 KiB
Rust
//! Serveur HTTP minimal pour les tests : sert des fichiers en mémoire et
|
|
//! journalise les chemins demandés.
|
|
#![allow(dead_code)]
|
|
|
|
use bytes::Bytes;
|
|
use http_body_util::Full;
|
|
use hyper::{Request, Response, StatusCode, body::Incoming, service::service_fn};
|
|
use hyper_util::rt::TokioIo;
|
|
use std::collections::HashMap;
|
|
use std::net::SocketAddr;
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
pub struct FileServer {
|
|
pub addr: SocketAddr,
|
|
pub hits: Arc<Mutex<Vec<String>>>,
|
|
_rt: tokio::runtime::Runtime,
|
|
}
|
|
|
|
impl FileServer {
|
|
pub fn url(&self) -> String {
|
|
format!("http://{}/rolling", self.addr)
|
|
}
|
|
pub fn hits(&self) -> Vec<String> {
|
|
self.hits.lock().unwrap().clone()
|
|
}
|
|
}
|
|
|
|
pub fn serve_files(files: HashMap<String, Vec<u8>>) -> FileServer {
|
|
let rt = tokio::runtime::Builder::new_multi_thread()
|
|
.enable_all()
|
|
.build()
|
|
.unwrap();
|
|
let files = Arc::new(files);
|
|
let hits = Arc::new(Mutex::new(Vec::new()));
|
|
let listener = rt
|
|
.block_on(tokio::net::TcpListener::bind("127.0.0.1:0"))
|
|
.unwrap();
|
|
let addr = listener.local_addr().unwrap();
|
|
let h = hits.clone();
|
|
rt.spawn(async move {
|
|
loop {
|
|
let Ok((stream, _)) = listener.accept().await else {
|
|
return;
|
|
};
|
|
let files = files.clone();
|
|
let h = h.clone();
|
|
tokio::spawn(async move {
|
|
let svc = service_fn(move |req: Request<Incoming>| {
|
|
let files = files.clone();
|
|
let h = h.clone();
|
|
async move {
|
|
let path = req.uri().path().trim_start_matches("/rolling/").to_string();
|
|
h.lock().unwrap().push(path.clone());
|
|
let resp = match files.get(&path) {
|
|
Some(b) => Response::new(Full::new(Bytes::from(b.clone()))),
|
|
None => {
|
|
let mut r = Response::new(Full::new(Bytes::from_static(b"404")));
|
|
*r.status_mut() = StatusCode::NOT_FOUND;
|
|
r
|
|
}
|
|
};
|
|
Ok::<_, std::convert::Infallible>(resp)
|
|
}
|
|
});
|
|
let _ = hyper::server::conn::http1::Builder::new()
|
|
.serve_connection(TokioIo::new(stream), svc)
|
|
.await;
|
|
});
|
|
}
|
|
});
|
|
FileServer {
|
|
addr,
|
|
hits,
|
|
_rt: rt,
|
|
}
|
|
}
|