ПРОЕКТЫ 


  АРХИВ 


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: ngx_http_bytes_filter_module & Content-Range



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



 




Copyright © Lexa Software, 1996-2009.