После вызова 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
.Но я думаю, что этот подход более надежен в отношении пробелов в заголовке.