Corrigir erro de download S3 causado por encoding duplo de caracteres na key
Contexto
Ao gerar arquivos (ex: relatórios ou CSVs) com nomes que incluem : no timestamp, como:
matriculas_2025-08-05_12:07:49.csv
... o caminho resultante no S3 é corretamente salvo com :. Porém, ao tentar gerar uma URL assinada a partir da URL de download, a aplicação extrai a key diretamente da URL já codificada, que contém %253A (duplo encode de : → %3A → %253A), como neste exemplo:
https://.../matriculas_2025-08-05_12%253A07%253A49.csv
Isso resultava em erro NoSuchKey do S3, pois a assinatura gerada referenciava uma key inexistente.
O que foi feito
- Adicionado
urldecode(urldecode(...))nas classesS3UrlPresignereS3BackupUrlPresigner - Isso garante que a chave seja convertida corretamente de
%253A→%3A→: - Garante compatibilidade com URLs que já foram codificadas uma ou mais vezes por navegadores, JS ou APIs
Evidências
1. URL com erro (antes):
https://.../matriculas_2025-08-05_12%253A07%253A49.csv
- Resultado:
NoSuchKey
2. Key extraída no código (antes):
matriculas_2025-08-05_12%253A07%253A49.csv
3. Key correta esperada pelo S3:
matriculas_2025-08-05_12:07:49.csv
4. Após correção:
- Key decodificada corretamente
- URL gerada com
Storage::temporaryUrl(...)válida - Download funcional
Testes manuais
- [x] Gerado link para arquivo com
:no nome - [x] Verificado que URL gerada contém
%3A(e não%253A) - [x] Download do arquivo realizado com sucesso
- [x] Backward compatibility mantida para arquivos com nomes simples
Checklist
- [x] Corrige bug de encoding duplo
- [x] Não afeta demais partes do sistema
- [x] Corrigido apenas no backend, sem dependência de NGINX ou frontend
Quality Gate passed
Issues
0 New issues
0 Accepted issues
Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code
@edineivaldameri pode validar por favor.
@msoares94 poderia informar os cenários onde o problema pode ocorrer, pois até o momento não tivemos relato desse erro.
Ao realizar testes no exportador de dados que é gera os aquivos no S3 com o mesmo padrão de nomenclatura não consegui em momento algum simular o erro relatado.