mirror of
https://codeberg.org/Toasterson/solstice-ci.git
synced 2026-04-11 05:40:41 +00:00
68 lines
1.7 KiB
Rust
68 lines
1.7 KiB
Rust
use axum::{
|
|
Router,
|
|
extract::Path,
|
|
http::StatusCode,
|
|
response::{IntoResponse, Response},
|
|
routing::get,
|
|
};
|
|
use std::net::SocketAddr;
|
|
use std::sync::Arc;
|
|
use tracing::{info, warn};
|
|
use uuid::Uuid;
|
|
|
|
use crate::persist::Persist;
|
|
|
|
#[derive(Clone)]
|
|
pub struct HttpState {
|
|
persist: Arc<Persist>,
|
|
}
|
|
|
|
pub fn build_router(persist: Arc<Persist>) -> Router {
|
|
let state = HttpState { persist };
|
|
Router::new()
|
|
.route("/jobs/{request_id}/logs", get(get_logs_moved))
|
|
.with_state(state)
|
|
}
|
|
|
|
async fn get_logs_moved(
|
|
Path(request_id): Path<String>,
|
|
_state: axum::extract::State<HttpState>,
|
|
) -> Response {
|
|
let base = std::env::var("LOGS_BASE_URL").ok();
|
|
let msg = if let Some(b) = base.as_ref() {
|
|
format!(
|
|
"Logs have moved: {}/jobs/{}/logs",
|
|
b.trim_end_matches('/'),
|
|
request_id
|
|
)
|
|
} else {
|
|
"Logs endpoint moved to logs-service; set LOGS_BASE_URL to enable 302 redirects".to_string()
|
|
};
|
|
if let Some(b) = base {
|
|
let loc = format!("{}/jobs/{}/logs", b.trim_end_matches('/'), request_id);
|
|
return (
|
|
StatusCode::MOVED_PERMANENTLY,
|
|
[(axum::http::header::LOCATION, loc.as_str())],
|
|
msg,
|
|
)
|
|
.into_response();
|
|
}
|
|
(StatusCode::GONE, msg).into_response()
|
|
}
|
|
|
|
pub async fn serve(
|
|
addr: SocketAddr,
|
|
persist: Arc<Persist>,
|
|
shutdown: impl std::future::Future<Output = ()>,
|
|
) {
|
|
let app = build_router(persist);
|
|
info!(%addr, "http server starting");
|
|
let listener = tokio::net::TcpListener::bind(addr)
|
|
.await
|
|
.expect("bind http");
|
|
let server = axum::serve(listener, app);
|
|
let _ = tokio::select! {
|
|
_ = server => {},
|
|
_ = shutdown => {},
|
|
};
|
|
}
|