Анализ HTTP_RANGE заголовка в PHP

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

В настоящее время я использую

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

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

Спасибо заранее.

Ответ 1

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

Пример Kickoff:

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

Ответ 2

Взято из пакет PEAR HTTP_Download:

function getRanges()
{
    return preg_match('/^bytes=((\d*-\d*,? ?)+)$/', @$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array();
}

Также неплохо использовать this packages для таких вещей!