ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re[2]: ngx_http_bytes_filter_module & Content-Range



Title: Re[2]: ngx_http_bytes_filter_module & Content-Range

Hello Maxim,



Спасибо за живое участие!



Клиент: стандартный. 


Задача:

Имеется файл (к примеру 100мб длиной). Данные внутри файла актуализируются постепенно (файл пишется многопоточным доунлоудером).


Клиент не знает о текущем состоянии файла и количестве потоков, которое используется для его записи.


Требуется правильно скорректировать возврат данных при обращении к файлу через http. 

То есть. Клиент запрашивает 4 потока по 25мб каждый. К примеру 1 и 3 потоки началами диапазонов удачно попали в уже имеющиеся данные, но концы диапазонов находятся в еще неготовой области. Тогда сервер должен вернуть header что он отдает не запрошенный диапазон, а только ту часть, которая уже готова на сервере (к примеру Content-Range: bytes 0-999/104857600, при этом в реальности пользователь запрашивал Range: bytes=0-26214400).


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





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



 




Copyright © Lexa Software, 1996-2009.