Análisis del encabezado HTTP_RANGE en PHP

¿Hay 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.

Solutions Collecting From Web of "Análisis del encabezado HTTP_RANGE en PHP"

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

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!

Hay un fragmento que implementa la compatibilidad del rango HTTP en la página fread() :

http://www.php.net/manual/en/function.fread.php#84115