2025-07-06 20:56:21 +00:00
|
|
|
use std::net::SocketAddr;
|
2025-07-04 22:15:52 +00:00
|
|
|
|
2025-07-04 00:00:11 +00:00
|
|
|
use axum::{
|
2025-07-04 22:15:52 +00:00
|
|
|
Extension, Json, Router,
|
2025-07-04 00:00:11 +00:00
|
|
|
extract::DefaultBodyLimit,
|
|
|
|
|
routing::{get, post},
|
|
|
|
|
};
|
|
|
|
|
use tokio::net::TcpListener;
|
|
|
|
|
use tower_http::limit::RequestBodyLimitLayer;
|
|
|
|
|
|
|
|
|
|
use crate::{
|
2025-07-06 20:56:21 +00:00
|
|
|
Config, JoecalState,
|
|
|
|
|
discovery::register_device,
|
2025-07-06 21:15:08 +00:00
|
|
|
transfer::{register_prepare_upload, register_upload},
|
2025-07-04 00:00:11 +00:00
|
|
|
};
|
|
|
|
|
|
2025-07-06 20:56:21 +00:00
|
|
|
impl JoecalState {
|
|
|
|
|
pub async fn start_http_server(&self, config: &Config) -> crate::error::Result<()> {
|
|
|
|
|
let app = self.create_router(&config);
|
|
|
|
|
let addr = SocketAddr::from(([0, 0, 0, 0], config.port));
|
2025-07-04 00:00:11 +00:00
|
|
|
|
|
|
|
|
let listener = TcpListener::bind(&addr).await?;
|
2025-07-04 22:15:52 +00:00
|
|
|
println!("HTTP server listening on {addr}");
|
2025-07-04 00:00:11 +00:00
|
|
|
|
|
|
|
|
axum::serve(
|
|
|
|
|
listener,
|
|
|
|
|
app.into_make_service_with_connect_info::<SocketAddr>(),
|
|
|
|
|
)
|
|
|
|
|
.await?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-06 20:56:21 +00:00
|
|
|
fn create_router(&self, config: &Config) -> Router {
|
2025-07-04 00:00:11 +00:00
|
|
|
let device = self.device.clone();
|
|
|
|
|
Router::new()
|
|
|
|
|
.route("/api/localsend/v2/register", post(register_device))
|
|
|
|
|
.route(
|
|
|
|
|
"/api/localsend/v2/info",
|
|
|
|
|
get(move || {
|
|
|
|
|
let device = device.clone();
|
|
|
|
|
async move { Json(device) }
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
.route(
|
|
|
|
|
"/api/localsend/v2/prepare-upload",
|
|
|
|
|
post(register_prepare_upload),
|
|
|
|
|
)
|
|
|
|
|
.route("/api/localsend/v2/upload", post(register_upload))
|
|
|
|
|
.layer(DefaultBodyLimit::disable())
|
|
|
|
|
.layer(RequestBodyLimitLayer::new(1024 * 1024 * 1024))
|
2025-07-06 20:56:21 +00:00
|
|
|
.layer(Extension(config.download_dir.clone()))
|
|
|
|
|
.with_state(self.clone())
|
2025-07-04 00:00:11 +00:00
|
|
|
}
|
|
|
|
|
}
|