Remove custom XML parsing
This commit is contained in:
parent
a825115472
commit
31a254103c
4 changed files with 46 additions and 23 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -2264,6 +2264,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc"
|
checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -3599,6 +3600,7 @@ dependencies = [
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"quick-xml",
|
"quick-xml",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
"serde",
|
||||||
"socket2",
|
"socket2",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ peer_binary_protocol = { path = "../peer_binary_protocol", default-features = fa
|
||||||
sha1w = { path = "../sha1w", default-features = false, package = "librqbit-sha1-wrapper", version = "4" }
|
sha1w = { path = "../sha1w", default-features = false, package = "librqbit-sha1-wrapper", version = "4" }
|
||||||
dht = { path = "../dht", package = "librqbit-dht", version = "5.1.0" }
|
dht = { path = "../dht", package = "librqbit-dht", version = "5.1.0" }
|
||||||
librqbit-upnp = { path = "../upnp", version = "0.1.1" }
|
librqbit-upnp = { path = "../upnp", version = "0.1.1" }
|
||||||
upnp-serve = { path = "../upnp-serve", version = "0.1.0", optional = true }
|
upnp-serve = { path = "../upnp-serve", default-features = false, version = "0.1.0", optional = true }
|
||||||
|
|
||||||
tokio = { version = "1", features = [
|
tokio = { version = "1", features = [
|
||||||
"macros",
|
"macros",
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,18 @@ name = "upnp-serve"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["sha1-crypto-hash"]
|
||||||
|
sha1-crypto-hash = ["librqbit-sha1-wrapper/sha1-crypto-hash"]
|
||||||
|
sha1-ring = ["librqbit-sha1-wrapper/sha1-ring"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.86"
|
anyhow = "1.0.86"
|
||||||
axum = { version = "0.7.5", features = ["tokio"] }
|
axum = { version = "0.7.5", features = ["tokio"] }
|
||||||
tokio = { version = "1.39.3", features = ["full"] }
|
tokio = { version = "1.39.3", features = ["full"] }
|
||||||
tracing = "0.1.40"
|
tracing = "0.1.40"
|
||||||
bstr = "1.10.0"
|
bstr = "1.10.0"
|
||||||
quick-xml = "0.36.1"
|
serde = { version = "1", features = ["derive"] }
|
||||||
http = "1.1.0"
|
http = "1.1.0"
|
||||||
httparse = "1.9.4"
|
httparse = "1.9.4"
|
||||||
uuid = { version = "1.10.0", features = ["v4"] }
|
uuid = { version = "1.10.0", features = ["v4"] }
|
||||||
|
|
@ -23,6 +28,7 @@ parking_lot = "0.12.3"
|
||||||
tokio-util = "0.7.11"
|
tokio-util = "0.7.11"
|
||||||
reqwest = { version = "0.12.7", default-features = false }
|
reqwest = { version = "0.12.7", default-features = false }
|
||||||
socket2 = "0.5.7"
|
socket2 = "0.5.7"
|
||||||
|
quick-xml = { version = "0.36.1", features = ["serialize"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tracing-subscriber = "0.3.18"
|
tracing-subscriber = "0.3.18"
|
||||||
|
|
|
||||||
|
|
@ -2,32 +2,44 @@ pub mod content_directory {
|
||||||
use response::ItemOrContainer;
|
use response::ItemOrContainer;
|
||||||
|
|
||||||
pub mod request {
|
pub mod request {
|
||||||
|
use anyhow::Context;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct Envelope {
|
||||||
|
#[serde(rename = "Body")]
|
||||||
|
body: Body,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct Body {
|
||||||
|
#[serde(rename = "Browse")]
|
||||||
|
browse: ContentDirectoryControlRequest,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, PartialEq, Eq, Debug)]
|
||||||
|
pub enum BrowseFlag {
|
||||||
|
BrowseDirectChildren,
|
||||||
|
BrowseMetadata,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct ContentDirectoryControlRequest {
|
pub struct ContentDirectoryControlRequest {
|
||||||
|
#[serde(rename = "ObjectID")]
|
||||||
pub object_id: usize,
|
pub object_id: usize,
|
||||||
|
#[serde(rename = "BrowseFlag")]
|
||||||
|
pub browse_flag: BrowseFlag,
|
||||||
|
#[serde(rename = "StartingIndex", default)]
|
||||||
|
pub starting_index: usize,
|
||||||
|
#[serde(rename = "RequestedCount", default)]
|
||||||
|
pub requested_count: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ContentDirectoryControlRequest {
|
impl ContentDirectoryControlRequest {
|
||||||
pub fn parse(s: &str) -> anyhow::Result<Self> {
|
pub fn parse(s: &str) -> anyhow::Result<Self> {
|
||||||
let mut reader = quick_xml::Reader::from_str(s);
|
let envelope: Envelope =
|
||||||
|
quick_xml::de::from_str(s).context("error deserializing")?;
|
||||||
use quick_xml::events::Event::{Eof, Start};
|
Ok(envelope.body.browse)
|
||||||
|
|
||||||
let mut object_id: Option<usize> = None;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
match reader.read_event()? {
|
|
||||||
Eof => break,
|
|
||||||
Start(e) if e.name().as_ref() == b"ObjectID" => {
|
|
||||||
let t = reader.read_text(e.to_end().name())?;
|
|
||||||
object_id = t.trim().parse().ok();
|
|
||||||
}
|
|
||||||
_ => continue,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(ContentDirectoryControlRequest {
|
|
||||||
object_id: object_id.unwrap_or(0),
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -70,12 +82,15 @@ pub mod content_directory {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::upnp_types::content_directory::request::ContentDirectoryControlRequest;
|
use crate::upnp_types::content_directory::request::{
|
||||||
|
BrowseFlag, ContentDirectoryControlRequest,
|
||||||
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_parse_content_directory_request() {
|
fn test_parse_content_directory_request() {
|
||||||
let s = include_str!("resources/test/ContentDirectoryControlExampleRequest.xml");
|
let s = include_str!("resources/test/ContentDirectoryControlExampleRequest.xml");
|
||||||
let req = ContentDirectoryControlRequest::parse(s).unwrap();
|
let req = ContentDirectoryControlRequest::parse(s).unwrap();
|
||||||
assert_eq!(req.object_id, 5);
|
assert_eq!(req.object_id, 5);
|
||||||
|
assert_eq!(req.browse_flag, BrowseFlag::BrowseDirectChildren)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue