ngx_http_bytes_filter_module & Content-Range
Maxim Dounin
mdounin at mdounin.ru
Fri May 29 16:12:48 MSD 2009
Hello!
On Fri, May 29, 2009 at 02:15:36PM +0300, Aleksej Novikov wrote:
> Hello Maxim,
>
>
> Спасибо за живое участие!
>
>
> Клиент: стандартный.
>
> Задача:
> Имеется файл (к примеру 100мб длиной). Данные внутри файла актуализируются постепенно (файл пишется многопоточным доунлоудером).
>
> Клиент не знает о текущем состоянии файла и количестве потоков, которое используется для его записи.
>
> Требуется правильно скорректировать возврат данных при обращении к файлу через http.
> То есть. Клиент запрашивает 4 потока по 25мб каждый. К примеру 1 и 3 потоки началами диапазонов удачно попали в уже имеющиеся данные, но концы диапазонов находятся в еще неготовой области. Тогда сервер должен вернуть header что он отдает не запрошенный диапазон, а только ту часть, которая уже готова на сервере (к примеру Content-Range: bytes 0-999/104857600, при этом в реальности пользователь запрашивал Range: bytes=0-26214400).
>
> В текущей реализации предполагается, что первоначальный запрос от клиента принимается скриптом на сервере, который по известной ему схеме определяет, попал ли пользователь в существующий диапазон и какая именно часть диапазона уже готова для отдачи. Далее скрипт должен инициализоровать выдачу существующего диапазона данных клиенту с учетом корректировок в заголовках, которые были описаны выше.
Ваша задача решается подсовыванием стандартному range-фильтру
нужного заголовка Range. Сделать это стандартными методами можно
через проксирование, как-то так:
location /your-script-here {
# returns X-Accel-Redirect to /files/... with X-New-Range
# header set
proxy_pass ...
}
location /files/ {
# proxy to real file with modified Range header set
set $new $upstream_http_x_new_range;
proxy_set_header Range $new;
proxy_pass ...
}
Но я совершенно не уверен что стандартные клиенты нормально
отнесутся к подобным вольностям.
Maxim Dounin
p.s. Your mail client doesn't wrap long lines properly.
>
>
>
>
> Wednesday, May 27, 2009, 6:12:49 PM, you wrote:
>
> > Hello!
>
> > On Tue, May 26, 2009 at 08:20:49PM +0300, Aleksej Novikov wrote:
>
> >> Hello Maxim,
>
> >> Monday, May 25, 2009, 6:31:18 PM, you wrote:
>
> >> > Hello!
>
> >> > On Mon, May 25, 2009 at 06:00:11PM +0300, Aleksej Novikov wrote:
>
> >> >> Hello Nginx-ru,
> >> >>
> >> >> Возникла необходимость в специфической отдаче файлов с
> >> >> использованием Range запросов.
> >> >>
> >> >> Был обнаружен замечательный патч написанный Maxim Dounin под названием
> >> >> ngx_http_bytes_filter_module
>
> >> > Это не патч, это модуль.
>
> >> Пардон !
>
>
> >> >> И всё бы замечательно но столкнулся с проблемой. Когда я с помощью
> >> >> этого модуля запрашиваю например отдать мне первые 100 байтов с 0 по 99
> >> >> от файла размером 100 килобайт
> >> >>
> >> >> то nginx выдаёт в ответе свой собственный заголовок Content-Range:
> >> >> bytes 0-99/100 (с какого по какой запросил, и суммарный размер)
> >> >>
> >> >> А хотелось бы получить вместо этого Content-Range: bytes 0-1/100000 -
> >> >> то есть чтобы указывался полный размер файла, а не возвращаемый объём.
> >> >>
> >> >> Попытка погасить данный Header c использованием fastch_hide_header
> >> >> ничего не дала - заголовок явно ставиться после работы модуля (в
> >> >> internal location)
> >> >>
> >> >> Может кто-то может порекомендовать решение длля возникшей проблемы ?
>
> >> > Выкинуть ngx_http_bytes_filter_module - он вам не нужен.
> >> > Используйте просто range-запросы.
>
> >> > Модуль ngx_http_bytes_filter_module нужен в том случае, если
> >> > требуется получить кусок файла в виде отдельного документа.
>
> >> Дело в том, что определение того, какой range мне нужен (а точнее
> >> необходимо отдать клиенту) определяется в момент запроса к серверу.
> >> Запрос попадает на php скрипт, который определяет (получает)
> >> необходимый range и делает X-Accel-Redirect на internal location в
> >> котором используется ngx_http_bytes_filter_module и происходит отдача
> >> указанного range. Отсюда и вырастает эта проблема.
>
> > RFC 2616 в разделе 10.2.7 206 Partial Content говорит нам, что
> > если Range в запросе не было - то его возвращать нельзя. А если в
> > запросе он был - то непонятно зачем нужен бекенд и что именно он
> > определяет.
>
> >> Был бы признателен, Максим, если бы Вы подсказали как решить подобное
> >> без Вашего модуля.
>
> > Вы для начала сформулируйте на простом человеческом языке в чём
> > состоит задача. Не "бекенд определяет ...", а хотя бы "клиент
> > приходит с запросом ... и должен получить в ответ ...".
>
> > Ну и определитесь заодно - клиент стандартный HTTP, или как сами
> > напишете так и будет.
>
> > Maxim Dounin
>
>
>
>
> --
> Best regards,
> Aleksej
> ICQ: 293-686-24
> GSM:371-293-686-24
More information about the nginx-ru
mailing list