diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 859a74a3..19425250 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -46,6 +46,7 @@ sentry = { version = "0.41.0", features = ["anyhow", "backtrace", "panic", "debu sentry-tower = "0.41.0" sentry-tracing = { version = "0.41.0", features = ["backtrace"] } reqwest = { version = "0.11", features = ["json"] } +strip-ansi-escapes = "0.2.1" [build-dependencies] dotenv = "0.15" diff --git a/backend/src/main.rs b/backend/src/main.rs index e7b802fd..11c7dd48 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -9,6 +9,7 @@ use axum::{ }; use sentry_tower::NewSentryLayer; use sqlx::{sqlite::SqliteConnectOptions, SqlitePool}; +use strip_ansi_escapes::strip; use tokio::sync::RwLock; use tower_http::cors::CorsLayer; use tracing_subscriber::{filter::LevelFilter, prelude::*}; @@ -209,11 +210,19 @@ fn main() -> anyhow::Result<()> { .layer(CorsLayer::permissive()) .layer(NewSentryLayer::new_from_top()); - let port: u16 = std::env::var("BACKEND_PORT") + let port = std::env::var("BACKEND_PORT") .or_else(|_| std::env::var("PORT")) .ok() - .and_then(|p| p.parse().ok()) - .unwrap_or(0); // Use 0 to find free port if no specific port provided + .and_then(|s| { + // remove any ANSI codes, then turn into String + let cleaned = String::from_utf8(strip(s.as_bytes())) + .expect("UTF-8 after stripping ANSI"); + cleaned.trim().parse::().ok() + }) + .unwrap_or_else(|| { + tracing::error!("Failed to parse port after stripping ANSI, defaulting to 0"); + 0 + }); // Use 0 to find free port if no specific port provided let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{port}")).await?; let actual_port = listener.local_addr()?.port(); // get → 53427 (example)