Парсинг заголовка HTTP_RANGE в PHP

Есть ли существующий способ проанализировать HTTP_RANGE заголовок правильно в PHP? Мысль я спросил бы здесь перед изобретением велосипед.

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

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

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

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

9
задан John Rasch 5 February 2010 в 17:55
поделиться

3 ответа

Каждый раз нам нужно думать о реальной жизни и своих потребностях. В этом случае ключевым пунктом является то, какой из них должен быть другим.

В реальной жизни собака и босс могут не иметь друг друга. Но ваши потребности в программном обеспечении должны повлиять на эти отношения.

  • Например, если вы разрабатываете программное обеспечение для управления пациентами ветеринара, для ветеринара, который лечит бездомных собак, отношения Пациент (собака) - Guardian (босс) должны быть такими: Боссы должны иметь, по крайней мере, одну собаку, и собака может не иметь какого-либо босса (тогда boss id является внешним ключом этих отношений), что означает, что в вашем дизайне класс собаки должен держать коллекцию боссов. Почему, потому что любой экземпляр босса не может быть создан без собак. Мы также можем принять это решение с помощью логики данных. Давайте подумаем о том, когда вы пытаетесь сохранить свои занятия с собакой и боссом в базе данных. Если условие связи, как указано выше, при сохранении бобышки следует вставить запись соединения в таблицу соединений.

  • Если вы разрабатываете это программное обеспечение для ветеринара, который не лечит бездомных собак, то отношения Пациент - Родитель должны быть такими: Собака должна иметь хотя бы одного босса, а босс должен иметь хотя бы собаку, и нам нужно рассмотреть этот особый случай отношений. Это означает, что любой из этих экземпляров классов не может быть создан без других. Таким образом, мы должны определить эту специализацию в нашем дизайне OO. Это означает, что нам нужен класс, который представляет эту зависимость. Эта зависимость будет сохранена в таблице соединений.

- Если ваше программное обеспечение разработано для ветеринара, который лечит бездомных собак и этих собак, принятых боссами, ваш дизайн должен быть таким: Любая собака может не иметь босса (боссов), и любой босс может не иметь любого пса (псов) до усыновления. В этом случае наш проектировать OO должен заботиться об этом особом случае. Этот случай немного похож на первый. Так что мы можем добавить коллекцию любого класса в другой. Но любые потребности в программном обеспечении, подобные этому, повлияют на другие потребности. Как отчетность. Если ветеринар беспокоится о собаках, которых усыновил босс (и), рано или поздно он просит сообщить, какую собаку перенял кто. Как и в предложении, (собаки, принятые боссом (ами)) лучше, если собачий класс содержит коллекцию классов босса.

Надеюсь, что смогу дать правильные ответы на ваш вопрос.

-121--1451221-

Используйте regex для тестирования перед отправкой 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;
        }

        // ...
    }
}

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

9
ответ дан 4 December 2019 в 19:33
поделиться

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

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

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

2
ответ дан 4 December 2019 в 19:33
поделиться
1
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: