Разбор заголовка HTTP_RANGE в PHP

Существует ли способ правильно проанализировать заголовок HTTP_RANGE в PHP? Решил спросить здесь, прежде чем изобретать велосипед.

сейчас я использую

preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches);

для анализа заголовка, но это не охватывает все возможные значения заголовка, поэтому мне интересно, есть ли функция или библиотека, которая уже может это сделать?

Заранее спасибо.


person Community    schedule 05.02.2010    source источник
comment
Я не знаю, как это сделать, но я бы попробовал это с регулярными выражениями. Взгляните на спецификацию http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00   -  person The Pixel Developer    schedule 05.02.2010


Ответы (3)


Вместо этого используйте регулярное выражение, чтобы протестировать перед отправкой 416. Затем просто разберите его, взорвав запятую , и дефис -. Я также вижу, что вы использовали \d+ в своем регулярном выражении, но на самом деле это не требуется. Когда какой-либо из индексов диапазона опущен, это просто означает «первый байт» или «последний байт». Вы также должны указать это в своем регулярном выражении. Также см. заголовок диапазона в спецификации HTTP, как вы должны справиться с этим.

Пример начала:

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;
        }

        // ...
    }
}

Изменить: $start всегда должно быть меньше $end

person BalusC    schedule 06.02.2010
comment
Пожалуйста. Отказ от ответственности: не проверено. Это более или менее переведено из моего примера сервлета Java здесь: balusc.blogspot.com/2009/02/ - person BalusC; 09.02.2010
comment
Вы сэкономили мне часы работы, поделившись своей реализацией сервлета Java! Большое спасибо. - person shadit; 04.11.2010
comment
спецификация RFC для диапазонов байтов также допускает что-то вроде bytes=-500, который является допустимым запросом последних 500 байт файла. Это немного усложняет извлечение диапазона, чем просто разнесение на символ -. - person Andrew Theis; 06.06.2013
comment
Этот ответ неверен, когда в нем говорится, что когда start отсутствует, его следует рассматривать как 0. Как сказал Эндрю Тайс, когда вы видите что-то вроде bytes=-500, это запрос на конец файла, а НЕ bytes=0-500 . - person Brigham; 02.02.2014


На странице fread() есть фрагмент, реализующий поддержку диапазона HTTP:

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

person Community    schedule 05.02.2010
comment
Это помогает, но глючит. Используйте только в качестве руководства. - person Alexandre Schmidt; 01.03.2016