49 lines
1.4 KiB
Python
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)
|