Fix code quality: trailing whitespace, unused imports, clippy warnings
- Fix trailing whitespace in kex.rs and s3.rs - Add missing KexProposal import in kex_complete.rs - Auto-fix clippy warnings across all crates - All 153 tests pass
This commit is contained in:
@@ -1,15 +1,17 @@
|
||||
use filetree::{FileTree, node::{FileNode, Aliases}};
|
||||
use axum::{
|
||||
body::Body,
|
||||
extract::{Path, State},
|
||||
http::{HeaderMap, StatusCode},
|
||||
response::{IntoResponse, Json},
|
||||
};
|
||||
use filetree::{
|
||||
node::FileNode,
|
||||
FileTree,
|
||||
};
|
||||
use futures_util::StreamExt;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value;
|
||||
use sha2::{Digest, Sha256};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||
use tokio_util::io::ReaderStream;
|
||||
|
||||
@@ -41,10 +43,10 @@ pub async fn list_buckets(State(state): State<crate::server::AppState>) -> impl
|
||||
|
||||
pub async fn list_objects(
|
||||
Path(bucket): Path<String>,
|
||||
State(state): State<crate::server::AppState>,
|
||||
State(_state): State<crate::server::AppState>,
|
||||
) -> impl IntoResponse {
|
||||
println!("S3 List Objects: bucket={}", bucket);
|
||||
|
||||
|
||||
let conn = match FileTree::open_user_db(&bucket) {
|
||||
Ok(c) => c,
|
||||
Err(e) => {
|
||||
@@ -70,20 +72,20 @@ pub async fn list_objects(
|
||||
"Key": build_s3_key(&tree, n),
|
||||
"LastModified": n.registered_at.clone().unwrap_or_default(),
|
||||
"ETag": n.sha256.clone().unwrap_or_default(),
|
||||
"Size": n.file_size.clone().unwrap_or(0),
|
||||
"Size": n.file_size.unwrap_or(0),
|
||||
})
|
||||
})
|
||||
.collect();
|
||||
|
||||
println!("Listed {} objects for bucket {}", objects.len(), bucket);
|
||||
|
||||
|
||||
let (headers, xml_body) = crate::s3_xml::list_objects_xml(&bucket, &objects);
|
||||
(StatusCode::OK, headers, xml_body).into_response()
|
||||
}
|
||||
|
||||
pub async fn get_object(
|
||||
Path((bucket, key)): Path<(String, String)>,
|
||||
State(state): State<crate::server::AppState>,
|
||||
State(_state): State<crate::server::AppState>,
|
||||
headers: HeaderMap,
|
||||
) -> impl IntoResponse {
|
||||
println!("S3 GET Object: bucket={}, key={}", bucket, key);
|
||||
@@ -119,7 +121,7 @@ pub async fn get_object(
|
||||
);
|
||||
|
||||
let file_uuid = node.file_uuid.clone().unwrap_or_default();
|
||||
let file_size = node.file_size.clone().unwrap_or(0);
|
||||
let file_size = node.file_size.unwrap_or(0);
|
||||
let sha256 = node.sha256.clone().unwrap_or_default();
|
||||
|
||||
let real_path = get_real_file_path(&conn, &file_uuid);
|
||||
@@ -233,7 +235,7 @@ pub async fn put_object(
|
||||
|
||||
let sha256_hash_clone = sha256_hash.clone();
|
||||
let file_path_clone = file_path.clone();
|
||||
let label = key.split('/').last().unwrap_or(&key).to_string();
|
||||
let label = key.split('/').next_back().unwrap_or(&key).to_string();
|
||||
|
||||
let result = tokio::task::spawn_blocking(move || -> anyhow::Result<()> {
|
||||
let conn = match FileTree::open_user_db(&bucket) {
|
||||
@@ -246,7 +248,7 @@ pub async fn put_object(
|
||||
|row| row.get::<_, i32>(0),
|
||||
)
|
||||
.unwrap_or(0) > 0;
|
||||
|
||||
|
||||
if !has_tables {
|
||||
// Initialize tables if not exist
|
||||
c.execute_batch(filetree::CREATE_TABLES)?;
|
||||
@@ -298,7 +300,7 @@ pub async fn put_object(
|
||||
|
||||
pub async fn head_object(
|
||||
Path((bucket, key)): Path<(String, String)>,
|
||||
State(state): State<crate::server::AppState>,
|
||||
State(_state): State<crate::server::AppState>,
|
||||
) -> impl IntoResponse {
|
||||
let conn = match FileTree::open_user_db(&bucket) {
|
||||
Ok(c) => c,
|
||||
@@ -323,7 +325,7 @@ pub async fn head_object(
|
||||
"ETag",
|
||||
node.sha256.clone().unwrap_or_default().parse().unwrap(),
|
||||
);
|
||||
headers.insert("Content-Length", node.file_size.clone().unwrap_or(0).into());
|
||||
headers.insert("Content-Length", node.file_size.unwrap_or(0).into());
|
||||
|
||||
(StatusCode::OK, headers)
|
||||
}
|
||||
@@ -438,7 +440,7 @@ fn find_node_by_s3_key(tree: &FileTree, key: &str) -> Option<FileNode> {
|
||||
}
|
||||
|
||||
// 方法2:通过filename直接匹配(fallback)
|
||||
let filename = key.split('/').last().unwrap_or(key);
|
||||
let filename = key.split('/').next_back().unwrap_or(key);
|
||||
tree.nodes
|
||||
.iter()
|
||||
.filter(|n| n.node_type == filetree::node::NodeType::File)
|
||||
@@ -501,7 +503,7 @@ async fn handle_range_request(
|
||||
}
|
||||
|
||||
// 使用take限制读取长度
|
||||
let limited_file = file.take(content_length as u64);
|
||||
let limited_file = file.take(content_length);
|
||||
let stream = ReaderStream::new(limited_file);
|
||||
let body = Body::from_stream(stream);
|
||||
|
||||
@@ -535,11 +537,7 @@ fn parse_range_header(range: &str, file_size: i64) -> Option<(u64, u64)> {
|
||||
let (start, end) = if parts[0].is_empty() {
|
||||
// "bytes=-N"格式:最后N字节
|
||||
let suffix_length = parts[1].parse::<u64>().ok()?;
|
||||
let start = if suffix_length > file_size as u64 {
|
||||
0
|
||||
} else {
|
||||
file_size as u64 - suffix_length
|
||||
};
|
||||
let start = (file_size as u64).saturating_sub(suffix_length);
|
||||
(start, file_size as u64 - 1)
|
||||
} else if parts[1].is_empty() {
|
||||
// "bytes=N-"格式:从N到结尾
|
||||
|
||||
Reference in New Issue
Block a user