From 50145460b9bb9ec8e0cf7a1dc0c0d48cdb9f7efd Mon Sep 17 00:00:00 2001
From: Quaternions <krakow20@gmail.com>
Date: Thu, 10 Apr 2025 00:24:55 -0700
Subject: [PATCH] rbx_asset: simplify gzip logic

---
 Cargo.lock              |  1 +
 rbx_asset/Cargo.toml    |  1 +
 rbx_asset/src/cloud.rs  |  8 ++------
 rbx_asset/src/cookie.rs | 15 ++++-----------
 rbx_asset/src/lib.rs    | 25 +++++++++----------------
 5 files changed, 17 insertions(+), 33 deletions(-)

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)
-}