Análisis del encabezado HTTP_RANGE en PHP
apache http-headers (3)
¿Existe alguna forma de analizar correctamente el encabezado HTTP_RANGE
en PHP? Pensé en preguntar aquí antes de reinventar la rueda.
Actualmente estoy usando
preg_match(''/bytes=(/d+)-(/d+)/'', $_SERVER[''HTTP_RANGE''], $matches);
para analizar el encabezado pero eso no cubre todos los valores posibles del encabezado, entonces me pregunto si hay una función o biblioteca que pueda hacer esto ya?
Gracias por adelantado.
En su lugar, use expresiones regulares para probarlo antes de enviar un 416
. Luego simplemente analízalo explotando en la coma ,
y el guión -
. También veo que usaste /d+
en tu expresión regular, pero en realidad no se requieren. Cuando se omite cualquiera de los índices de rango, significa "primer byte" o "último byte". Debería cubrir eso en su expresión regular también. Consulte también el encabezado Rango en la especificación HTTP de cómo se supone que debe manejarlo.
Ejemplo de lanzamiento:
if (isset($_SERVER[''HTTP_RANGE''])) {
if (!preg_match(''^bytes=/d*-/d*(,/d*-/d*)*$'', $_SERVER[''HTTP_RANGE''])) {
header(''HTTP/1.1 416 Requested Range Not Satisfiable'');
header(''Content-Range: bytes */'' . filelength); // Required in 416.
exit;
}
$ranges = explode('','', substr($_SERVER[''HTTP_RANGE''], 6));
foreach ($ranges as $range) {
$parts = explode(''-'', $range);
$start = $parts[0]; // If this is empty, this should be 0.
$end = $parts[1]; // If this is empty or greater than than filelength - 1, this should be filelength - 1.
if ($start > $end) {
header(''HTTP/1.1 416 Requested Range Not Satisfiable'');
header(''Content-Range: bytes */'' . filelength); // Required in 416.
exit;
}
// ...
}
}
Editar: $ start siempre debe ser menor que $ end
Hay un fragmento que implementa la compatibilidad del rango HTTP en la página fread()
:
Tomado del paquete PEAR HTTP_Download :
function getRanges()
{
return preg_match(''/^bytes=((/d*-/d*,? ?)+)$/'', @$_SERVER[''HTTP_RANGE''], $matches) ? $matches[1] : array();
}
¡También es una buena idea usar estos paquetes para cosas como esta!