Quando o ficheiro transferido começa com uma linha de estado HTTP
Mantenha o enquadramento da resposta HTTP fora do artefacto transferido, em vez de copiar cada byte recebido do socket do proxy para o ficheiro de saída.
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.