Как обнаружить file_get_contents возвращает сжатый контент - PullRequest
0 голосов
/ 11 мая 2018

Я использую следующее, чтобы получить URL видео на моем сайте.

$vid = 231231; 
$url = file_get_contents("https://www.thevideositeurl.com/embed/{$vid}/") 
echo $url ; 

Обратите внимание: переменная $vid является динамической, а иногда возвращает gziped содержимое.

Я уже знаю, что могу использовать функцию gzdecode, чтобы распаковать этот контент следующим образом:

$vid = 231231; 
$url = file_get_contents("https://www.thevideositeurl.com/embed/{$vid}/") 
$decodeit = gzdecode($url);
echo $decodeit; 

Теперь проблема в том, что мне нужно найти способ декодировать переменную $url, только если это необходимо. Под « required » я имею в виду: если ($url) он возвращает содержимое gziped, потому что мне нужно использовать один и тот же код для того же источника.

Здесь можно сделать какую-нибудь проверку? Как?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

После вызова file_get_contents, $ http_response_header вернет заголовки ответа, включая код состояния.

Заголовок Content-Encoding указывает, какая кодировкаНапример, заголовок Content-Encoding: gzip будет указывать, что содержимое закодировано с помощью gzip.

. Поэтому я написал бы функцию для сопоставления заголовков в массив header name => value, а затем проверил наличиезапись Content-Encoding, чтобы определить, сжат ли ответ с помощью gzip.

Создать карту из имени заголовка в значение

function transformIntoHeaderMap(array $headers)
{

Избавиться от статусазаголовок (например, HTTP/1.1 200 OK), так как он не умещается в формате header name: value.

    $headersWithValues = array_filter($headers, function ($header) { return strpos($header, ':') !== false; });

Теперь разделите заголовки на : и запишите ключ и значение в карту.Обрежьте значение, чтобы избавиться от пробелов в начале / конце.

    $headerMap = [];
    foreach ($headersWithValues as $header) {
            list($key, $value) = explode(':', $header);
            $headerMap[$key] = trim($value);
    }

    return $headerMap;
}

Определите, является ли содержимое сжатым

Проверьте, установлен ли заголовок, изатем проверьте, имеет ли оно искомое значение (gzip).

function isGzipHeaderSet(array $headerMap)
{
    return isset($headerMap['Content-Encoding']) && 
        $headerMap['Content-Encoding'] == 'gzip';
}

Распакуйте содержимое, если оно было разархивировано

$vid = 231231; 
$contents = file_get_contents("https://www.thevideositeurl.com/embed/{$vid}/");
if (isGzipHeaderSet(transformIntoHeaderMap($http_response_header))) {
    $contents = gzdecode($contents);
}

echo $contents;

Альтернатива

Более простым подходом может быть использование array_search и поиск строки Content-Encoding: gzip в $http_response_header.Но я думаю, что этот подход более надежен в отношении пробелов в заголовке.

0 голосов
/ 11 мая 2018

Вы можете проверить тип содержимого или кодировку содержимого в $ http_response_header .

...