From 3ccb28ba233abd2af9f28d70e74a7369e9274e8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 29 Jul 2021 10:18:46 +0300 Subject: [PATCH] reqwest: Switch from hyperx to headers The maintainer of hyperx has kind of special opinions and doesn't want to play well with the rest of the ecosystem, see https://github.com/dekellum/hyperx/pull/33 . This currently causes cargo outdated to fail because of suboptimal dependencies. Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/issues/159 --- net/reqwest/Cargo.toml | 2 +- net/reqwest/src/reqwesthttpsrc/imp.rs | 67 +++++++++++++-------------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/net/reqwest/Cargo.toml b/net/reqwest/Cargo.toml index 37f69a0a..7e49c4f0 100644 --- a/net/reqwest/Cargo.toml +++ b/net/reqwest/Cargo.toml @@ -11,7 +11,7 @@ edition = "2018" url = "2.1" reqwest = { version = "0.11", features = ["cookies", "gzip"] } futures = "0.3" -hyperx = "1.0" +headers = "0.3" mime = "0.3" gst = { package = "gstreamer", version = "0.17" } gst-base = { package = "gstreamer-base", version = "0.17" } diff --git a/net/reqwest/src/reqwesthttpsrc/imp.rs b/net/reqwest/src/reqwesthttpsrc/imp.rs index 7c58e26f..76990feb 100644 --- a/net/reqwest/src/reqwesthttpsrc/imp.rs +++ b/net/reqwest/src/reqwesthttpsrc/imp.rs @@ -338,12 +338,9 @@ impl ReqwestHttpSrc { start: u64, stop: Option, ) -> Result> { - use hyperx::header::{ - qitem, AcceptEncoding, AcceptRanges, ByteRangeSpec, Connection, ContentLength, - ContentRange, ContentRangeSpec, ContentType, Cookie, Encoding, Range, RangeUnit, - TypedHeaders, UserAgent, - }; - use reqwest::header::HeaderMap; + use headers::{Connection, ContentLength, ContentRange, HeaderMapExt, Range, UserAgent}; + use reqwest::header::{self, HeaderMap, HeaderName, HeaderValue}; + use std::str::FromStr; gst_debug!(CAT, obj: src, "Creating new request for {}", uri); @@ -358,30 +355,32 @@ impl ReqwestHttpSrc { let mut headers = HeaderMap::new(); if settings.keep_alive { - headers.encode(&Connection::keep_alive()); + headers.typed_insert(Connection::keep_alive()); } else { - headers.encode(&Connection::close()); + headers.typed_insert(Connection::close()); } match (start != 0, stop) { (false, None) => (), (true, None) => { - headers.encode(&Range::Bytes(vec![ByteRangeSpec::AllFrom(start)])); + headers.typed_insert(Range::bytes(start..).unwrap()); } (_, Some(stop)) => { - headers.encode(&Range::Bytes(vec![ByteRangeSpec::FromTo(start, stop - 1)])); + headers.typed_insert(Range::bytes(start..stop).unwrap()); } } - headers.encode(&UserAgent::new(settings.user_agent)); + headers.typed_insert(UserAgent::from_str(&settings.user_agent).unwrap()); if !settings.compress { // Compression is the default - headers.encode(&AcceptEncoding(vec![qitem(Encoding::Identity)])); + headers.insert( + header::ACCEPT_ENCODING, + HeaderValue::from_str("identity").unwrap(), + ); }; if let Some(ref extra_headers) = settings.extra_headers { - use reqwest::header::{HeaderName, HeaderValue}; use std::convert::TryFrom; for (field, value) in extra_headers.iter() { @@ -447,20 +446,14 @@ impl ReqwestHttpSrc { } if !settings.cookies.is_empty() { - let mut cookies = Cookie::new(); - for cookie in settings.cookies { - let mut split = cookie.splitn(2, '='); - let key = split.next(); - let value = split.next(); - if let (Some(key), Some(value)) = (key, value) { - cookies.append(String::from(key), String::from(value)); - } - } - headers.encode(&cookies); + headers.insert( + header::COOKIE, + HeaderValue::from_str(&settings.cookies.join("; ")).unwrap(), + ); } if settings.iradio_mode { - headers.append("icy-metadata", "1".parse().unwrap()); + headers.insert("icy-metadata", "1".parse().unwrap()); } // Add all headers for the request here @@ -529,19 +522,19 @@ impl ReqwestHttpSrc { } let headers = res.headers(); - let size = headers.decode().map(|ContentLength(cl)| cl + start).ok(); + let size = headers + .typed_get::() + .map(|ContentLength(cl)| cl + start); - let accept_byte_ranges = if let Ok(AcceptRanges(ref ranges)) = headers.decode() { - ranges.iter().any(|u| *u == RangeUnit::Bytes) - } else { - false - }; + let accept_byte_ranges = headers + .get(header::ACCEPT_RANGES) + .map(|ranges| ranges == "bytes") + .unwrap_or(false); let seekable = size.is_some() && accept_byte_ranges; - let position = if let Ok(ContentRange(ContentRangeSpec::Bytes { - range: Some((range_start, _)), - .. - })) = headers.decode() + let position = if let Some((range_start, _)) = headers + .typed_get::() + .and_then(|range| range.bytes_range()) { range_start } else { @@ -565,7 +558,11 @@ impl ReqwestHttpSrc { .build() }); - if let Ok(ContentType(ref content_type)) = headers.decode() { + if let Some(content_type) = headers + .get(header::CONTENT_TYPE) + .and_then(|content_type| content_type.to_str().ok()) + .and_then(|content_type| mime::Mime::from_str(content_type).ok()) + { gst_debug!(CAT, obj: src, "Got content type {}", content_type); if let Some(ref mut caps) = caps { let caps = caps.get_mut().unwrap();