Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

api: return HTTP 404 error if browse path is invalid

+36 -7
+3 -2
Cargo.lock
··· 446 446 447 447 [[package]] 448 448 name = "anyhow" 449 - version = "1.0.87" 449 + version = "1.0.89" 450 450 source = "registry+https://github.com/rust-lang/crates.io-index" 451 - checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8" 451 + checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" 452 452 453 453 [[package]] 454 454 name = "arrayvec" ··· 5406 5406 name = "rockbox-sys" 5407 5407 version = "0.1.0" 5408 5408 dependencies = [ 5409 + "anyhow", 5409 5410 "serde", 5410 5411 ] 5411 5412
+13 -2
crates/server/src/lib.rs
··· 235 235 if path.starts_with("/tree_entries?") { 236 236 let params: Vec<_> = path.split('?').collect(); 237 237 let params = queryst::parse(params[1]).unwrap_or_default(); 238 - println!("{}", params); 239 - rb::browse::rockbox_browse_at(params["q"].as_str().unwrap_or("/")); 238 + let path = params.get("q").unwrap().as_str().unwrap(); 239 + 240 + if let Err(e) = rb::browse::rockbox_browse_at(path) { 241 + if e.to_string().starts_with("No such file or directory") { 242 + let response = "HTTP/1.1 404 Not Found\r\n\r\n"; 243 + stream.write_all(response.as_bytes()).unwrap(); 244 + return; 245 + } 246 + let response = format!("HTTP/1.1 500 Internal Server Error\r\n\r\n{}", e); 247 + stream.write_all(response.as_bytes()).unwrap(); 248 + return; 249 + } 250 + 240 251 let mut entries = vec![]; 241 252 let context = rb::browse::tree_get_context(); 242 253
+1
crates/sys/Cargo.toml
··· 4 4 version = "0.1.0" 5 5 6 6 [dependencies] 7 + anyhow = "1.0.89" 7 8 serde = { version = "1.0.210", features = ["derive"] }
+19 -3
crates/sys/src/browse.rs
··· 1 - use std::ffi::CString; 1 + use anyhow::Error; 2 + use std::{ffi::CString, fs}; 2 3 3 4 use crate::{ 4 5 types::tree::{Entry, TreeContext}, 5 6 AddToPlCallback, Mp3Entry, PlaylistInsertCb, Tm, 6 7 }; 7 8 8 - pub fn rockbox_browse_at(path: &str) -> i32 { 9 + pub fn rockbox_browse_at(path: &str) -> Result<i32, Error> { 10 + if fs::metadata(path)?.is_file() { 11 + let path = CString::new(path).unwrap(); 12 + return Ok(unsafe { crate::rockbox_browse_at(path.as_ptr()) }); 13 + } 14 + 15 + if !fs::metadata(path)?.is_dir() { 16 + return Err(anyhow::anyhow!("Path is not a file or directory")); 17 + } 18 + 19 + if !path.ends_with("/") { 20 + let path = format!("{}/", path); 21 + let path = CString::new(path).unwrap(); 22 + return Ok(unsafe { crate::rockbox_browse_at(path.as_ptr()) }) 23 + } 24 + 9 25 let path = CString::new(path).unwrap(); 10 - unsafe { crate::rockbox_browse_at(path.as_ptr()) } 26 + Ok(unsafe { crate::rockbox_browse_at(path.as_ptr()) }) 11 27 } 12 28 13 29 pub fn rockbox_browse() -> i32 {