diff --git a/Cargo.lock b/Cargo.lock index a09533c..c020c03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1295,6 +1295,7 @@ dependencies = [ name = "rbx_asset" version = "0.4.3" dependencies = [ + "bytes", "chrono", "flate2", "reqwest", diff --git a/rbx_asset/Cargo.toml b/rbx_asset/Cargo.toml index 27c955b..2b0ad78 100644 --- a/rbx_asset/Cargo.toml +++ b/rbx_asset/Cargo.toml @@ -11,6 +11,7 @@ authors = ["Rhys Lloyd <krakow20@gmail.com>"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +bytes = "1.10.1" chrono = { version = "0.4.38", features = ["serde"] } flate2 = "1.0.29" reqwest = { version = "0.12.4", features = ["json","multipart"] } diff --git a/rbx_asset/src/cloud.rs b/rbx_asset/src/cloud.rs index 0016b97..fae4f61 100644 --- a/rbx_asset/src/cloud.rs +++ b/rbx_asset/src/cloud.rs @@ -1,4 +1,4 @@ -use crate::{ResponseError,ReaderType,maybe_gzip_decode,read_readable}; +use crate::{ResponseError,maybe_gzip_decode}; #[derive(Debug,serde::Deserialize,serde::Serialize)] #[allow(nonstandard_style,dead_code)] @@ -456,11 +456,7 @@ impl Context{ ).await.map_err(GetError::Response)? .bytes().await.map_err(GetError::Reqwest)?; - match maybe_gzip_decode(std::io::Cursor::new(body)){ - Ok(ReaderType::GZip(readable))=>read_readable(readable), - Ok(ReaderType::Raw(readable))=>read_readable(readable), - Err(e)=>Err(e), - }.map_err(GetError::IO) + maybe_gzip_decode(body).map_err(GetError::IO) } pub async fn get_asset_versions(&self,config:AssetVersionsRequest)->Result<AssetVersionsResponse,AssetVersionsError>{ let raw_url=format!("https://apis.roblox.com/assets/v1/assets/{}/versions",config.asset_id); diff --git a/rbx_asset/src/cookie.rs b/rbx_asset/src/cookie.rs index 7ad53f2..5ba4532 100644 --- a/rbx_asset/src/cookie.rs +++ b/rbx_asset/src/cookie.rs @@ -1,4 +1,4 @@ -use crate::{ResponseError,ReaderType,maybe_gzip_decode,read_readable}; +use crate::{ResponseError,maybe_gzip_decode}; #[derive(Debug)] pub enum PostError{ @@ -464,11 +464,8 @@ impl Context{ ).await.map_err(GetError::Response)? .bytes().await.map_err(GetError::Reqwest)?; - match maybe_gzip_decode(std::io::Cursor::new(body)){ - Ok(ReaderType::GZip(readable))=>read_readable(readable), - Ok(ReaderType::Raw(readable))=>read_readable(readable), - Err(e)=>Err(e), - }.map_err(GetError::IO) + + maybe_gzip_decode(body).map_err(GetError::IO) } pub async fn get_asset_v2(&self,config:GetAssetRequest)->Result<GetAssetV2,GetAssetV2Error>{ let mut url=reqwest::Url::parse("https://assetdelivery.roblox.com/v2/asset").map_err(GetAssetV2Error::ParseError)?; @@ -508,11 +505,7 @@ impl Context{ ).await.map_err(GetError::Response)? .bytes().await.map_err(GetError::Reqwest)?; - match maybe_gzip_decode(std::io::Cursor::new(body)){ - Ok(ReaderType::GZip(readable))=>read_readable(readable), - Ok(ReaderType::Raw(readable))=>read_readable(readable), - Err(e)=>Err(e), - }.map_err(GetError::IO) + maybe_gzip_decode(body).map_err(GetError::IO) } pub async fn get_asset_details(&self,config:GetAssetDetailsRequest)->Result<AssetDetails,GetError>{ let url=reqwest::Url::parse(format!("https://economy.roblox.com/v2/assets/{}/details",config.asset_id).as_str()).map_err(GetError::ParseError)?; diff --git a/rbx_asset/src/lib.rs b/rbx_asset/src/lib.rs index c41ff74..0c6f8fb 100644 --- a/rbx_asset/src/lib.rs +++ b/rbx_asset/src/lib.rs @@ -36,21 +36,14 @@ pub(crate) async fn response_ok(response:reqwest::Response)->Result<reqwest::Res } } -//idk how to do this better -pub(crate) enum ReaderType<R:std::io::Read>{ - GZip(flate2::read::GzDecoder<std::io::BufReader<R>>), - Raw(std::io::BufReader<R>), -} -pub(crate) fn maybe_gzip_decode<R:std::io::Read>(input:R)->std::io::Result<ReaderType<R>>{ - let mut buf=std::io::BufReader::new(input); - let peek=std::io::BufRead::fill_buf(&mut buf)?; - match &peek[0..2]{ - b"\x1f\x8b"=>Ok(ReaderType::GZip(flate2::read::GzDecoder::new(buf))), - _=>Ok(ReaderType::Raw(buf)), +pub(crate) fn maybe_gzip_decode(data:bytes::Bytes)->std::io::Result<Vec<u8>>{ + match data.get(0..2){ + Some(b"\x1f\x8b")=>{ + use std::io::Read; + let mut buf=Vec::new(); + flate2::read::GzDecoder::new(std::io::Cursor::new(data)).read_to_end(&mut buf)?; + Ok(buf) + }, + _=>Ok(data.to_vec()), } } -pub(crate) fn read_readable(mut readable:impl std::io::Read)->std::io::Result<Vec<u8>>{ - let mut contents=Vec::new(); - readable.read_to_end(&mut contents)?; - Ok(contents) -}