Initial Commit

This commit is contained in:
2026-03-15 23:14:54 +01:00
commit 492014ec30
5 changed files with 2048 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

1961
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

19
Cargo.toml Normal file
View File

@@ -0,0 +1,19 @@
[package]
name = "osm-proxy"
version = "0.1.0"
edition = "2024"
[dependencies]
axum = "0.8.8"
http-body-util = "0.1.3"
reqwest = "0.13.2"
thiserror = "2.0.18"
tokio = { version = "1.50.0", features = [
"rt",
"rt-multi-thread",
"sync",
"macros",
"net",
"signal",
] }
tower-http = { version = "0.6.8", features = ["fs", "trace", "cors"] }

67
src/main.rs Normal file
View File

@@ -0,0 +1,67 @@
use std::path::PathBuf;
use axum::Router;
use axum::extract::Path;
use axum::response::IntoResponse;
use axum::routing::get;
use reqwest::StatusCode;
use tokio::fs;
use tower_http::cors::CorsLayer;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let app = Router::new()
.route("/{*path}", get(get_file))
.layer(CorsLayer::permissive());
let listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
axum::serve(listener, app.into_make_service()).await?;
Ok(())
}
async fn get_file(Path(path): Path<String>) -> Result<impl IntoResponse, StatusCode> {
let local_path = PathBuf::from("static").join(&path);
// Check if file exists
if fs::metadata(&local_path).await.is_err() {
// Build remote URL
let remote_url = format!("https://osm.rrze.fau.de/osmhd/{}", path);
// Download file
let response = reqwest::get(&remote_url)
.await
.map_err(|_| StatusCode::BAD_GATEWAY)?;
if !response.status().is_success() {
return Err(StatusCode::NOT_FOUND);
}
let bytes = response
.bytes()
.await
.map_err(|_| StatusCode::BAD_GATEWAY)?;
// Ensure directory exists
if let Some(parent) = local_path.parent() {
fs::create_dir_all(parent)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
}
// Save file
fs::write(&local_path, &bytes)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
}
// Serve file
let bytes = fs::read(&local_path)
.await
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;
Ok(([(axum::http::header::CONTENT_TYPE, "image/png")], bytes))
}

BIN
static/10/513/512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B