Estou tentando criar um proxy HTTP em php e recebi um erro ao definir Content-Type
o cabeçalho. Este código quebrou meu código inteiro:
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer(fread($sc, 512));
header("Content-Type: {$mimeType}");
então comecei a depurar, alterei o código assim:
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer(fread($sc, 512));
echo $mimeType;
Ele disse image/jpg
e o link que estou tentando acessar via proxy também é jpg. Então ele está detectando corretamente, mas então eu alterei para header("Content-Type: {$mimeType}")
ecoar, de alguma forma ele parou de funcionar. Por favor, verifique esta captura de tela , Content-Type
mas image/jpg
a imagem retornada para mim não é nada (na verdade, ela aparece quando a imagem está quebrada).
Código completo:
$context = stream_context_create([
"http" => [
"method" => "GET",
"header" => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36\r\n"
]
]);
$content = fopen($url, 'rb', false, $context);
if ($content) {
$finfo = new finfo(FILEINFO_MIME_TYPE);
// removing 2 lines below will make it work again
$mimeType = $finfo->buffer(fread($content, 512));
header("Content-Type: {$mimeType}");
fpassthru($content);
fclose($content);
} else {
http_response_code(500);
echo "Failed to retrieve the requested resource.";
}
get_headers($url, 1)
O motivo pelo qual não usei Content-Type
é que alguns sites não retornam isso corretamente.
Você está lendo até 512 bytes com fread, mas nunca envia esses bytes para o cliente. Você está cortando o começo da resposta.
Ecoe os bytes antes de chamar fpassthru: