Se um suposto PDF ou folha de cálculo começa com HTTP/1.1 200 OK, o transferidor guardou uma resposta em bruto em vez do artefacto. Esta resposta esquemática contém apenas quatro bytes de conteúdo:

HTTP/1.1 200 OK
Transfer-Encoding: chunked

4
DATA
0

O artefacto é DATA. A linha de estado, os cabeçalhos, o marcador de tamanho e a estrutura de terminação pertencem ao HTTP. Remover um número fixo de bytes não é seguro porque os comprimentos dos cabeçalhos variam. Copiar tudo após a primeira linha em branco ainda deixa o enquadramento por blocos, e respostas informativas podem preceder a resposta final.

Para uma transferência normal, substitua a cópia do socket em bruto para o ficheiro pela interface de corpo de resposta do cliente HTTP. Configure o respetivo proxy, valide o estado final e transmita o corpo para uma saída temporária. O cliente trata do enquadramento da mensagem: corpos delimitados por comprimento, por blocos (chunked) e pela ligação exigem análise diferente.

A codificação de conteúdo é mais uma camada. Decida se precisa de bytes descodificados do artefacto ou de conteúdo em bruto explicitamente pedido, usando o comportamento documentado do cliente. Bytes comprimidos não são automaticamente corrupção do proxy.

Se a aplicação tiver de manter código ao nível do socket, é dela a responsabilidade por todas essas regras de análise, bem como pelo tratamento de leitura e escrita. Escreva apenas o número de bytes efetivamente devolvidos por uma leitura, não a capacidade do buffer, e trate escritas parciais. Caso contrário, conteúdo obsoleto do buffer pode corromper até um corpo corretamente extraído.

O HTTPS exige mais do que remover uma resposta CONNECT: após um túnel estabelecido com êxito, estabeleça o TLS de destino e só depois analise a resposta HTTP interna. Os bytes cifrados após os cabeçalhos do proxy não são o ficheiro transferível.

Deixe a saída falhada ou incompleta sob um nome temporário. Publique-a apenas depois de a transferência e as verificações do artefacto serem bem-sucedidas; um ficheiro não vazio não demonstra uma transferência completa.

Artigos relacionados