MirrorAPI/actions/compress_decompress/compress_decompress.py

49 lines
1.4 KiB
Python

@staticmethod
def decompress(vf_string):
"""
Descomprime e decodifica texto compactado ou codificado.
Agora:
- Tenta automaticamente Base64 decode ANTES de tudo.
- Depois detecta zlib.
- Decodifica ISO-8859-1 se não for zlib.
"""
if not vf_string:
return ""
# Caso seja stream (ex.: BLOB Firebird)
if hasattr(vf_string, "read"):
vf_string = vf_string.read()
# Garante bytes
if isinstance(vf_string, str):
vf_bytes = vf_string.encode("latin1", errors="ignore")
else:
vf_bytes = vf_string
# --- NOVO: TENTATIVA DE BASE64 DECODE ANTES ---
try:
# Remove quebras e espaços — comum em JSON, Firebird, Delphi
cleaned = vf_bytes.strip().replace(b"\n", b"").replace(b"\r", b"")
decoded = base64.b64decode(cleaned, validate=True)
vf_bytes = decoded
except Exception:
# Não era base64, segue normalmente
pass
# Detecta assinatura zlib
is_zlib = len(vf_bytes) > 2 and vf_bytes[0] == 0x78 and vf_bytes[1] in (0x9C, 0xDA)
if is_zlib:
try:
text = zlib.decompress(vf_bytes).decode("iso-8859-1", errors="ignore")
return text
except Exception:
pass
# Caso não seja zlib, tenta apenas decodificar ISO-8859-1
try:
return vf_bytes.decode("iso-8859-1", errors="ignore")
except Exception:
return str(vf_string)