rbx_asset: simplify gzip logic

This commit is contained in:
Quaternions 2025-04-10 00:24:55 -07:00
parent df2a5bb9ce
commit 50145460b9
Signed by: Quaternions
GPG Key ID: D0DF5964F79AC131
5 changed files with 17 additions and 33 deletions

1
Cargo.lock generated

@ -1295,6 +1295,7 @@ dependencies = [
name = "rbx_asset"
version = "0.4.3"
dependencies = [
"bytes",
"chrono",
"flate2",
"reqwest",

@ -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"] }

@ -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);

@ -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)?;

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