fix(upload): error on upload with the same filename (#258)
This commit is contained in:
parent
c60a614258
commit
4987cfe5e5
|
@ -0,0 +1,9 @@
|
||||||
|
[server]
|
||||||
|
address = "127.0.0.1:8000"
|
||||||
|
max_content_length = "10MB"
|
||||||
|
upload_path = "./upload"
|
||||||
|
|
||||||
|
[paste]
|
||||||
|
random_url = { type = "alphanumeric", length = "4", suffix_mode = true }
|
||||||
|
default_extension = "txt"
|
||||||
|
duplicate_files = true
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
content="test data"
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
echo "$content" > file
|
||||||
|
}
|
||||||
|
|
||||||
|
run_test() {
|
||||||
|
file_url=$(curl -s -F "file=@file" -H "filename:fn_from_header.txt" localhost:8000)
|
||||||
|
test "$file_url" = "http://localhost:8000/fn_from_header.txt"
|
||||||
|
test "$content" = "$(cat upload/fn_from_header.txt)"
|
||||||
|
test "$content" = "$(curl -s $file_url)"
|
||||||
|
file_url=$(curl -s -F "file=@file" -H "filename:fn_from_header.txt" localhost:8000)
|
||||||
|
test "$file_url" = "file already exists"
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown() {
|
||||||
|
rm file
|
||||||
|
rm -r upload
|
||||||
|
}
|
|
@ -176,6 +176,14 @@ impl Paste {
|
||||||
.map(|v| v.to_string_lossy())
|
.map(|v| v.to_string_lossy())
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.to_string();
|
.to_string();
|
||||||
|
let file_path = util::glob_match_file(path.clone())
|
||||||
|
.map_err(|_| IoError::new(IoErrorKind::Other, String::from("path is not valid")))?;
|
||||||
|
if file_path.is_file() && file_path.exists() {
|
||||||
|
return Err(IoError::new(
|
||||||
|
IoErrorKind::AlreadyExists,
|
||||||
|
String::from("file already exists\n"),
|
||||||
|
));
|
||||||
|
}
|
||||||
if let Some(timestamp) = expiry_date {
|
if let Some(timestamp) = expiry_date {
|
||||||
path.set_file_name(format!("{file_name}.{timestamp}"));
|
path.set_file_name(format!("{file_name}.{timestamp}"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -907,6 +907,63 @@ mod tests {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[actix_web::test]
|
||||||
|
async fn test_upload_same_filename() -> Result<(), Error> {
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.server.upload_path = env::current_dir()?;
|
||||||
|
|
||||||
|
let app = test::init_service(
|
||||||
|
App::new()
|
||||||
|
.app_data(Data::new(RwLock::new(config)))
|
||||||
|
.app_data(Data::new(Client::default()))
|
||||||
|
.configure(configure_routes),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
let file_name = "test_file.txt";
|
||||||
|
let header_filename = "fn_from_header.txt";
|
||||||
|
let timestamp = util::get_system_time()?.as_secs().to_string();
|
||||||
|
let response = test::call_service(
|
||||||
|
&app,
|
||||||
|
get_multipart_request(×tamp, "file", file_name)
|
||||||
|
.insert_header((
|
||||||
|
header::HeaderName::from_static("filename"),
|
||||||
|
header::HeaderValue::from_static("fn_from_header.txt"),
|
||||||
|
))
|
||||||
|
.to_request(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
assert_eq!(StatusCode::OK, response.status());
|
||||||
|
assert_body(
|
||||||
|
response.into_body(),
|
||||||
|
&format!("http://localhost:8080/{header_filename}\n"),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let timestamp = util::get_system_time()?.as_secs().to_string();
|
||||||
|
let response = test::call_service(
|
||||||
|
&app,
|
||||||
|
get_multipart_request(×tamp, "file", file_name)
|
||||||
|
.insert_header((
|
||||||
|
header::HeaderName::from_static("filename"),
|
||||||
|
header::HeaderValue::from_static("fn_from_header.txt"),
|
||||||
|
))
|
||||||
|
.to_request(),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
assert_eq!(StatusCode::INTERNAL_SERVER_ERROR, response.status());
|
||||||
|
assert_body(response.into_body(), "file already exists\n").await?;
|
||||||
|
|
||||||
|
fs::remove_file(header_filename)?;
|
||||||
|
let serve_request = TestRequest::get()
|
||||||
|
.uri(&format!("/{header_filename}"))
|
||||||
|
.to_request();
|
||||||
|
let response = test::call_service(&app, serve_request).await;
|
||||||
|
assert_eq!(StatusCode::NOT_FOUND, response.status());
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[actix_web::test]
|
#[actix_web::test]
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
async fn test_upload_duplicate_file() -> Result<(), Error> {
|
async fn test_upload_duplicate_file() -> Result<(), Error> {
|
||||||
|
|
Loading…
Reference in New Issue