Intereting Posts
Как я могу создать реферальную систему в PHP? Проверьте, является ли String ALL CAPS в PHP Как создать pdf-файл с помощью dompdf и перенаправить на другую страницу Как получить непальскую дату на PHP? Исключение «сеанс уже запущено …» в приложении Zend Framework Outlook 2007 получает html-почту как источник с заголовками, другие MUA работают нормально. Зачем? 403 Запрещено при отправке формы Как инициализировать $ id из другой функции? BreezeJS на Durandal с PHP REST API (Laravel) Как вытащить друзей пользователя из Facebook (с v 2.0 Facebook Auth) Как отобразить два массива в одном цикле foreach? Как заставить php запускать прологическую программу, Команда работает, когда я использую в командной строке, но не с php Предупреждение: mysql_result (): предоставленный аргумент не является допустимым ресурсом результата MySQL в (…) в строке 4 Есть ли функция или переменная PHP, указывающая имя локального хоста? Смешивание переменной PHP с строковым литералом

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

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

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

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

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

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

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

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

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

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

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

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