hopefully fix files

This commit is contained in:
Julian 2023-03-05 09:12:18 -05:00
parent 6f12373923
commit 6f42483f16
Signed by: NotNite
GPG key ID: BD91A5402CCEB08A
3 changed files with 96 additions and 13 deletions

75
Cargo.lock generated
View file

@ -56,6 +56,7 @@ dependencies = [
"bitflags", "bitflags",
"bytes", "bytes",
"futures-util", "futures-util",
"headers",
"http", "http",
"http-body", "http-body",
"hyper", "hyper",
@ -96,6 +97,12 @@ dependencies = [
"tower-service", "tower-service",
] ]
[[package]]
name = "base64"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.21.0" version = "0.21.0"
@ -371,6 +378,31 @@ dependencies = [
"hashbrown", "hashbrown",
] ]
[[package]]
name = "headers"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584"
dependencies = [
"base64 0.13.1",
"bitflags",
"bytes",
"headers-core",
"http",
"httpdate",
"mime",
"sha1",
]
[[package]]
name = "headers-core"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429"
dependencies = [
"http",
]
[[package]] [[package]]
name = "heck" name = "heck"
version = "0.4.1" version = "0.4.1"
@ -565,6 +597,16 @@ version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
[[package]]
name = "mime_guess"
version = "2.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
dependencies = [
"mime",
"unicase",
]
[[package]] [[package]]
name = "minimal-lexical" name = "minimal-lexical"
version = "0.2.1" version = "0.2.1"
@ -839,7 +881,7 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b"
dependencies = [ dependencies = [
"base64", "base64 0.21.0",
] ]
[[package]] [[package]]
@ -931,12 +973,25 @@ dependencies = [
"axum", "axum",
"dotenvy", "dotenvy",
"hyper", "hyper",
"mime_guess",
"nanoid", "nanoid",
"serde", "serde",
"sqlx", "sqlx",
"tokio", "tokio",
"tokio-stream", "tokio-stream",
"tokio-util", "tower",
"tower-http",
]
[[package]]
name = "sha1"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
] ]
[[package]] [[package]]
@ -1253,10 +1308,17 @@ dependencies = [
"http", "http",
"http-body", "http-body",
"http-range-header", "http-range-header",
"httpdate",
"mime",
"mime_guess",
"percent-encoding",
"pin-project-lite", "pin-project-lite",
"tokio",
"tokio-util",
"tower", "tower",
"tower-layer", "tower-layer",
"tower-service", "tower-service",
"tracing",
] ]
[[package]] [[package]]
@ -1304,6 +1366,15 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
[[package]]
name = "unicase"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
dependencies = [
"version_check",
]
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.10" version = "0.3.10"

View file

@ -8,12 +8,14 @@ edition = "2021"
[dependencies] [dependencies]
anyhow = "1.0.69" anyhow = "1.0.69"
async-trait = "0.1.65" async-trait = "0.1.65"
axum = { version = "0.6.10", features = ["multipart"] } axum = { version = "0.6.10", features = ["multipart", "headers"] }
dotenvy = "0.15.6" dotenvy = "0.15.6"
hyper = "0.14.24" hyper = "0.14.24"
mime_guess = "2.0.4"
nanoid = "0.4.0" nanoid = "0.4.0"
serde = { version = "1.0.152", features = ["derive"] } serde = { version = "1.0.152", features = ["derive"] }
sqlx = { version = "0.6.2", features = ["sqlite", "runtime-tokio-rustls"] } sqlx = { version = "0.6.2", features = ["sqlite", "runtime-tokio-rustls"] }
tokio = { version = "1.26.0", features = ["full"] } tokio = { version = "1.26.0", features = ["full"] }
tokio-stream = { version = "0.1.12", features = ["net"] } tokio-stream = { version = "0.1.12", features = ["net"] }
tokio-util = { version = "0.7.7", features = ["io"] } tower = "0.4.13"
tower-http = { version = "0.4.0", features = ["fs"] }

View file

@ -1,28 +1,38 @@
use crate::state::ReqState; use crate::state::ReqState;
use axum::{ use axum::{
body::StreamBody,
extract::{Path, State}, extract::{Path, State},
response::IntoResponse, response::IntoResponse,
}; };
use hyper::StatusCode; use hyper::{Body, Request, StatusCode, Uri};
use tokio_util::io::ReaderStream; use std::{path::PathBuf, str::FromStr};
use tower::util::ServiceExt;
use tower_http::services::ServeFile;
pub async fn get(State(state): ReqState, Path(id): Path<String>) -> impl IntoResponse { pub async fn get(State(state): ReqState, Path(id): Path<String>) -> impl IntoResponse {
if id.len() < 8 { if id.len() < 8 {
return Err(StatusCode::NOT_FOUND); return Err(StatusCode::NOT_FOUND);
} }
let extension = PathBuf::from_str(&id).map_err(|_| StatusCode::NOT_FOUND)?;
let extension = extension.extension().and_then(|ext| ext.to_str());
let id = id[..8].to_string(); let id = id[..8].to_string();
let path = state.files_dir.join(id.clone()); let path = state.files_dir.join(id.clone());
if path.exists() { if path.exists() {
let file = tokio::fs::File::open(path) let req = Request::builder()
.await .uri(Uri::from_static("/"))
.map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; .body(Body::empty())
let stream = ReaderStream::new(file); .unwrap();
let body = StreamBody::new(stream);
Ok(body) if let Some(ext) = extension {
let mime = mime_guess::from_ext(ext).first_or_octet_stream();
let serve_file = ServeFile::new_with_mime(path, &mime).oneshot(req);
Ok(serve_file.await.unwrap().map(axum::body::boxed))
} else {
let serve_file = ServeFile::new(path).oneshot(req);
Ok(serve_file.await.unwrap().map(axum::body::boxed))
}
} else { } else {
Err(StatusCode::NOT_FOUND) Err(StatusCode::NOT_FOUND)
} }