Skip to content

Commit

Permalink
feat(server): allow named url shortening (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
Vaelatern committed Dec 5, 2024
1 parent db3ceec commit e390f46
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 4 deletions.
8 changes: 8 additions & 0 deletions fixtures/test-url-upload-override-filename/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[server]
address = "127.0.0.1:8000"
max_content_length = "10MB"
upload_path = "./upload"

[paste]
default_extension = "txt"
duplicate_files = true
24 changes: 24 additions & 0 deletions fixtures/test-url-upload-override-filename/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env bash

url="https://orhun.dev/"

url2="https://orhun.dev/does/not/exist"

setup() {
:;
}

run_test() {
curl -s -F "url=$url" -H "filename: abc" localhost:8000 > /dev/null
test "$url" = "$(cat upload/url/abc)"

curl -s -F "url=$url2" -H "filename: abc" localhost:8000 > /dev/null
test "$url2" = "$(cat upload/url/abc)"

curl -s -F "url=$url2" -H "filename: what-a-great-link" localhost:8000 > /dev/null
test "$url2" = "$(cat upload/url/what-a-great-link)"
}

teardown() {
rm -r upload
}
28 changes: 25 additions & 3 deletions src/paste.rs
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,12 @@ impl Paste {
///
/// [`random_url.enabled`]: crate::random::RandomURLConfig::enabled
#[allow(deprecated)]
pub fn store_url(&self, expiry_date: Option<u128>, config: &Config) -> IoResult<String> {
pub fn store_url(
&self,
expiry_date: Option<u128>,
header_filename: Option<String>,
config: &Config,
) -> IoResult<String> {
let data = str::from_utf8(&self.data)
.map_err(|e| IoError::new(IoErrorKind::Other, e.to_string()))?;
let url = Url::parse(data).map_err(|e| IoError::new(IoErrorKind::Other, e.to_string()))?;
Expand All @@ -264,6 +269,9 @@ impl Paste {
file_name = random_text;
}
}
if let Some(header_filename) = header_filename {
file_name = header_filename;
}
let mut path =
util::safe_path_join(self.type_.get_path(&config.server.upload_path)?, &file_name)?;
if let Some(timestamp) = expiry_date {
Expand Down Expand Up @@ -461,7 +469,7 @@ mod tests {
data: url.as_bytes().to_vec(),
type_: PasteType::Url,
};
let file_name = paste.store_url(None, &config)?;
let file_name = paste.store_url(None, None, &config)?;
let file_path = PasteType::Url
.get_path(&config.server.upload_path)
.expect("Bad upload path")
Expand All @@ -474,7 +482,21 @@ mod tests {
data: url.as_bytes().to_vec(),
type_: PasteType::Url,
};
assert!(paste.store_url(None, &config).is_err());
assert!(paste.store_url(None, None, &config).is_err());

let url = String::from("https://orhun.dev/");
let paste = Paste {
data: url.as_bytes().to_vec(),
type_: PasteType::Url,
};
let prepared_result = paste.store_url(None, Some("prepared-name".to_string()), &config)?;
let file_path = PasteType::Url
.get_path(&config.server.upload_path)
.expect("Bad upload path")
.join(&prepared_result);
assert_eq!(prepared_result, "prepared-name");
assert_eq!(url, fs::read_to_string(&file_path)?);
fs::remove_file(file_path)?;

config.server.max_content_length = Byte::from_str("30k").expect("cannot parse byte");
let url = String::from("https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg");
Expand Down
2 changes: 1 addition & 1 deletion src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ async fn upload(
let config = config
.read()
.map_err(|_| error::ErrorInternalServerError("cannot acquire config"))?;
paste.store_url(expiry_date, &config)?
paste.store_url(expiry_date, header_filename, &config)?
}
};
info!(
Expand Down

0 comments on commit e390f46

Please sign in to comment.