Skip to content

Commit 78e831f

Browse files
committed
wip webdav impl
1 parent 2f939d9 commit 78e831f

File tree

3 files changed

+29
-27
lines changed

3 files changed

+29
-27
lines changed

.idea/workspace.xml

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ dav-server = { git = "https://github.com/messense/dav-server-rs.git" }
2222
[dev-dependencies]
2323
rusty-hook = "^0.11.2"
2424

25-
2625
[lints.rust]
2726
unsafe_code = "warn"
2827
unused_results = "warn"

src/server/mod.rs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@ use axum_server::tls_rustls::RustlsConfig;
1515
use rcgen::generate_simple_self_signed;
1616
use std::future::IntoFuture;
1717
use std::net::SocketAddr;
18+
use dav_server::DavHandler;
19+
use dav_server::fakels::FakeLs;
20+
use dav_server::localfs::LocalFs;
21+
use dav_server::memls::MemLs;
1822
use tokio::net::TcpListener;
1923
use tokio::signal;
20-
use tracing::{error, info, trace};
24+
use tracing::{debug, error, info, trace};
2125
#[derive(Clone)]
2226
struct GitServer {
2327
instance_url: String,
@@ -195,37 +199,35 @@ async fn init(Path((user, repo_name)): Path<(String, String)>) -> impl IntoRespo
195199
}
196200
}
197201

198-
/// Handle file or directory requests for a repository.
199202
async fn handle_repo(
200203
Path((user, repo_name, path)): Path<(String, String, String)>,
204+
uri: Uri,
201205
) -> impl IntoResponse {
202-
let repo_path = format!("repos/{}/{}", user, repo_name);
203-
let file_path = format!("{}/{}", repo_path, path);
206+
let repo_path = format!("/repos/{}/{}", user, repo_name);
204207

205-
match tokio::fs::metadata(&file_path).await {
206-
Ok(metadata) => {
207-
if metadata.is_dir() {
208-
info!("Directory: {}", file_path);
209-
(StatusCode::OK, format!("Directory: {}", file_path)).into_response()
210-
} else {
211-
match tokio::fs::read(&file_path).await {
212-
Ok(contents) => (StatusCode::OK, contents).into_response(),
213-
Err(_) => (
214-
StatusCode::NOT_FOUND,
215-
format!("File not found: {}", file_path),
216-
)
217-
.into_response(),
218-
}
219-
}
208+
let relative_uri = {
209+
if let Some(query) = uri.query() {
210+
format!("/{}?{}", path, query)
211+
} else {
212+
format!("/{}", path)
220213
}
221-
Err(_) => (
222-
StatusCode::NOT_FOUND,
223-
format!("Path not found: {}", file_path),
224-
)
225-
.into_response(),
226-
}
214+
};
215+
debug!("Repository path: {}, relative URI: {}", repo_path.escape_debug(), relative_uri.escape_debug());
216+
217+
let dav_server = DavHandler::builder()
218+
.filesystem(LocalFs::new(repo_path.clone(), true, false, false))
219+
.locksystem(MemLs::new())
220+
.build_handler();
221+
222+
let req = Request::builder()
223+
.uri(relative_uri)
224+
.body(Body::empty())
225+
.unwrap();
226+
debug!("DAV Request: {:?}", req);
227+
dav_server.handle(req).await
227228
}
228229

230+
229231
/// Fallback handler for unmatched routes on the main router.
230232
async fn fallback(uri: Uri, State(_state): State<GitServer>, method: Method) -> impl IntoResponse {
231233
let msg = format!("404 - Not Found: {} {}", method, uri);

0 commit comments

Comments
 (0)