diff options
author | Rutger Broekhoff | 2024-07-12 00:29:57 +0200 |
---|---|---|
committer | Rutger Broekhoff | 2024-07-12 00:29:57 +0200 |
commit | bc709f0f23be345a1e2ccd06acd36bd5dac40bde (patch) | |
tree | 4ffe66b1ac246e0a9eab4a2649a7db5bb3a1ff0a /gitolfs3-server/src/main.rs | |
parent | 3e67a3486eed22522f4352503ef7067ca81a8050 (diff) | |
download | gitolfs3-bc709f0f23be345a1e2ccd06acd36bd5dac40bde.tar.gz gitolfs3-bc709f0f23be345a1e2ccd06acd36bd5dac40bde.zip |
Diffstat (limited to 'gitolfs3-server/src/main.rs')
-rw-r--r-- | gitolfs3-server/src/main.rs | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/gitolfs3-server/src/main.rs b/gitolfs3-server/src/main.rs index c9911ed..46e840a 100644 --- a/gitolfs3-server/src/main.rs +++ b/gitolfs3-server/src/main.rs | |||
@@ -10,12 +10,13 @@ use dlimit::DownloadLimiter; | |||
10 | 10 | ||
11 | use axum::{ | 11 | use axum::{ |
12 | extract::OriginalUri, | 12 | extract::OriginalUri, |
13 | http::{StatusCode, Uri}, | 13 | http::{self, Uri}, |
14 | routing::{get, post}, | 14 | routing::{get, post}, |
15 | Router, ServiceExt, | 15 | Router, ServiceExt, |
16 | }; | 16 | }; |
17 | use handler::AppState; | 17 | use handler::{handle_batch, handle_obj_download, AppState}; |
18 | use std::{process::ExitCode, sync::Arc}; | 18 | use std::{process::ExitCode, sync::Arc}; |
19 | use tokio::net::TcpListener; | ||
19 | use tower::Layer; | 20 | use tower::Layer; |
20 | 21 | ||
21 | #[tokio::main] | 22 | #[tokio::main] |
@@ -39,14 +40,14 @@ async fn main() -> ExitCode { | |||
39 | dl_limiter, | 40 | dl_limiter, |
40 | }); | 41 | }); |
41 | let app = Router::new() | 42 | let app = Router::new() |
42 | .route("/batch", post(handler::batch)) | 43 | .route("/batch", post(handle_batch)) |
43 | .route("/:oid0/:oid1/:oid", get(handler::obj_download)) | 44 | .route("/:oid0/:oid1/:oid", get(handle_obj_download)) |
44 | .with_state(shared_state); | 45 | .with_state(shared_state); |
45 | 46 | ||
46 | let middleware = axum::middleware::map_request(rewrite_url); | 47 | let middleware = axum::middleware::map_request(rewrite_url); |
47 | let app_with_middleware = middleware.layer(app); | 48 | let app_with_middleware = middleware.layer(app); |
48 | 49 | ||
49 | let listener = match tokio::net::TcpListener::bind(conf.listen_addr).await { | 50 | let listener = match TcpListener::bind(conf.listen_addr).await { |
50 | Ok(listener) => listener, | 51 | Ok(listener) => listener, |
51 | Err(e) => { | 52 | Err(e) => { |
52 | println!("Failed to listen: {e}"); | 53 | println!("Failed to listen: {e}"); |
@@ -63,25 +64,23 @@ async fn main() -> ExitCode { | |||
63 | } | 64 | } |
64 | } | 65 | } |
65 | 66 | ||
66 | async fn rewrite_url<B>( | 67 | async fn rewrite_url<B>(mut req: http::Request<B>) -> Result<http::Request<B>, http::StatusCode> { |
67 | mut req: axum::http::Request<B>, | ||
68 | ) -> Result<axum::http::Request<B>, StatusCode> { | ||
69 | let uri = req.uri(); | 68 | let uri = req.uri(); |
70 | let original_uri = OriginalUri(uri.clone()); | 69 | let original_uri = OriginalUri(uri.clone()); |
71 | 70 | ||
72 | let Some(path_and_query) = uri.path_and_query() else { | 71 | let Some(path_and_query) = uri.path_and_query() else { |
73 | // L @ no path & query | 72 | // L @ no path & query |
74 | return Err(StatusCode::BAD_REQUEST); | 73 | return Err(http::StatusCode::BAD_REQUEST); |
75 | }; | 74 | }; |
76 | let Some((repo, path)) = path_and_query.path().split_once("/info/lfs/objects") else { | 75 | let Some((repo, path)) = path_and_query.path().split_once("/info/lfs/objects") else { |
77 | return Err(StatusCode::NOT_FOUND); | 76 | return Err(http::StatusCode::NOT_FOUND); |
78 | }; | 77 | }; |
79 | let repo = repo | 78 | let repo = repo |
80 | .trim_start_matches('/') | 79 | .trim_start_matches('/') |
81 | .trim_end_matches('/') | 80 | .trim_end_matches('/') |
82 | .to_string(); | 81 | .to_string(); |
83 | if !path.starts_with('/') || !repo.ends_with(".git") { | 82 | if !path.starts_with('/') || !repo.ends_with(".git") { |
84 | return Err(StatusCode::NOT_FOUND); | 83 | return Err(http::StatusCode::NOT_FOUND); |
85 | } | 84 | } |
86 | 85 | ||
87 | let mut parts = uri.clone().into_parts(); | 86 | let mut parts = uri.clone().into_parts(); |
@@ -90,7 +89,7 @@ async fn rewrite_url<B>( | |||
90 | Some(q) => format!("{path}?{q}").try_into().ok(), | 89 | Some(q) => format!("{path}?{q}").try_into().ok(), |
91 | }; | 90 | }; |
92 | let Ok(new_uri) = Uri::from_parts(parts) else { | 91 | let Ok(new_uri) = Uri::from_parts(parts) else { |
93 | return Err(StatusCode::INTERNAL_SERVER_ERROR); | 92 | return Err(http::StatusCode::INTERNAL_SERVER_ERROR); |
94 | }; | 93 | }; |
95 | 94 | ||
96 | *req.uri_mut() = new_uri; | 95 | *req.uri_mut() = new_uri; |