<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Re[2]: ngx_http_bytes_filter_module & Content-Range</title>
<META http-equiv=Content-Type content="text/html; charset=koi8-r">
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
body {
  margin: 5px 5px 5px 5px;
  background-color: #ffffff;
}
/* ========== Text Styles ========== */
hr { color: #000000}
span.rvts1 /* Heading */
{
 font-size: 10pt;
 font-family: 'Arial';
 font-weight: bold;
 color: #0000ff;
}
span.rvts2 /* Subheading */
{
 font-size: 10pt;
 font-family: 'Arial';
 font-weight: bold;
 color: #000080;
}
span.rvts3 /* Keywords */
{
 font-size: 10pt;
 font-family: 'Arial';
 font-style: italic;
 color: #800000;
}
a.rvts4, span.rvts4 /* Jump 1 */
{
 font-size: 10pt;
 font-family: 'Arial';
 color: #008000;
 text-decoration: underline;
}
a.rvts5, span.rvts5 /* Jump 2 */
{
 font-size: 10pt;
 font-family: 'Arial';
 color: #008000;
 text-decoration: underline;
}
span.rvts6
{
 font-weight: bold;
 color: #800000;
}
span.rvts7
{
 font-size: 8pt;
 font-family: 'arial';
 font-style: italic;
 color: #c0c0c0;
}
/* ========== Para Styles ========== */
p,ul,ol /* Paragraph Style */
{
 text-align: left;
 text-indent: 0px;
 padding: 0px 0px 0px 0px;
 margin: 0px 0px 0px 0px;
}
.rvps1 /* Centered */
{
 text-align: center;
}
--></style>
</head>
<body>

<p>Hello Maxim,</p>
<p><br></p>
<p><br></p>
<p>Спасибо за живое участие!</p>
<p><br></p>
<p><br></p>
<p>Клиент: стандартный.&nbsp;</p>
<p><br></p>
<p>Задача:</p>
<p>Имеется файл (к примеру 100мб длиной). Данные внутри файла актуализируются постепенно (файл пишется многопоточным доунлоудером).</p>
<p><br></p>
<p>Клиент не знает о текущем состоянии файла и количестве потоков, которое используется для его записи.</p>
<p><br></p>
<p>Требуется правильно скорректировать возврат данных при обращении к файлу через http.&nbsp;</p>
<p>То есть. Клиент запрашивает 4 потока по 25мб каждый. К примеру 1 и 3 потоки началами диапазонов удачно попали в уже имеющиеся данные, но концы диапазонов находятся в еще неготовой области. Тогда сервер должен вернуть header что он отдает не запрошенный диапазон, а только ту часть, которая уже готова на сервере (к примеру Content-Range: bytes 0-999/104857600, при этом в реальности пользователь запрашивал Range: bytes=0-26214400).</p>
<p><br></p>
<p>В текущей реализации предполагается, что первоначальный запрос от клиента принимается скриптом на сервере, который по известной ему схеме определяет, попал ли пользователь в существующий диапазон и какая именно часть диапазона уже готова для отдачи. Далее скрипт должен инициализоровать выдачу существующего диапазона данных клиенту с учетом корректировок в заголовках, которые были описаны выше.</p>
<p><br></p>
<p><br></p>
<p><br></p>
<p><br></p>
<p>Wednesday, May 27, 2009, 6:12:49 PM, you wrote:</p>
<p><br></p>
<p><span class=rvts6>&gt; Hello!</span></p>
<p><br></p>
<p><span class=rvts6>&gt; On Tue, May 26, 2009 at 08:20:49PM +0300, Aleksej Novikov wrote:</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; Hello Maxim,</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; Monday, May 25, 2009, 6:31:18 PM, you wrote:</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt; Hello!</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt; On Mon, May 25, 2009 at 06:00:11PM +0300, Aleksej Novikov wrote:</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;Hello Nginx-ru,</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt;&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp; &nbsp;Возникла необходимость в специфической отдаче файлов с</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;использованием &nbsp;Range запросов.</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt;&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;Был обнаружен замечательный патч написанный Maxim Dounin под названием</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;ngx_http_bytes_filter_module</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt; Это не патч, это модуль.</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; Пардон !</span></p>
<p><br></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;И всё бы замечательно но столкнулся с проблемой. Когда я с помощью</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;этого модуля запрашиваю например отдать мне первые 100 байтов с 0 по 99</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;от файла размером 100 килобайт</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt;&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;то nginx выдаёт в ответе свой собственный заголовок &nbsp;Content-Range:</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;bytes 0-99/100 &nbsp;(с какого по какой запросил, и суммарный размер)</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt;&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;А хотелось бы получить вместо этого &nbsp;Content-Range: bytes 0-1/100000 -</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;то есть чтобы указывался полный размер файла, а не возвращаемый объём.</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt;&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;Попытка погасить данный Header c использованием fastch_hide_header</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;ничего не дала - заголовок явно ставиться после работы модуля (в</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;internal location)</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt;&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt;&gt; &nbsp; &nbsp;Может кто-то может порекомендовать решение длля возникшей проблемы ?</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt; Выкинуть ngx_http_bytes_filter_module - он вам не нужен. &nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt; Используйте просто range-запросы.</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; &gt; Модуль ngx_http_bytes_filter_module нужен в том случае, если&nbsp;</span></p>
<p><span class=rvts6>&gt;&gt; &gt; требуется получить кусок файла в виде отдельного документа.</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; Дело &nbsp;в &nbsp;том, &nbsp;что &nbsp;определение &nbsp;того, какой range мне нужен (а точнее</span></p>
<p><span class=rvts6>&gt;&gt; необходимо &nbsp;отдать &nbsp;клиенту) &nbsp;определяется в момент запроса к серверу.</span></p>
<p><span class=rvts6>&gt;&gt; Запрос &nbsp; попадает &nbsp; на &nbsp; php &nbsp;скрипт, &nbsp;который &nbsp;определяет &nbsp;(получает)</span></p>
<p><span class=rvts6>&gt;&gt; необходимый &nbsp;range &nbsp;и &nbsp;делает X-Accel-Redirect на internal location &nbsp;в</span></p>
<p><span class=rvts6>&gt;&gt; котором используется ngx_http_bytes_filter_module и &nbsp;происходит отдача</span></p>
<p><span class=rvts6>&gt;&gt; указанного range. Отсюда и вырастает эта проблема.</span></p>
<p><br></p>
<p><span class=rvts6>&gt; RFC 2616 в разделе 10.2.7 206 Partial Content говорит нам, что&nbsp;</span></p>
<p><span class=rvts6>&gt; если Range в запросе не было - то его возвращать нельзя. &nbsp;А если в&nbsp;</span></p>
<p><span class=rvts6>&gt; запросе он был - то непонятно зачем нужен бекенд и что именно он&nbsp;</span></p>
<p><span class=rvts6>&gt; определяет.</span></p>
<p><br></p>
<p><span class=rvts6>&gt;&gt; Был &nbsp;бы признателен, Максим, если бы Вы подсказали как решить подобное</span></p>
<p><span class=rvts6>&gt;&gt; без Вашего модуля.</span></p>
<p><br></p>
<p><span class=rvts6>&gt; Вы для начала сформулируйте на простом человеческом языке в чём&nbsp;</span></p>
<p><span class=rvts6>&gt; состоит задача. &nbsp;Не "бекенд определяет ...", а хотя бы "клиент&nbsp;</span></p>
<p><span class=rvts6>&gt; приходит с запросом ... и должен получить в ответ ...".</span></p>
<p><br></p>
<p><span class=rvts6>&gt; Ну и определитесь заодно - клиент стандартный HTTP, или как сами&nbsp;</span></p>
<p><span class=rvts6>&gt; напишете так и будет.</span></p>
<p><br></p>
<p><span class=rvts6>&gt; Maxim Dounin</span></p>
<p><br></p>
<p><br></p>
<p><br></p>
<p><br></p>
<p><span class=rvts7>--&nbsp;</span></p>
<p><span class=rvts7>Best regards,</span></p>
<p><span class=rvts7>Aleksej &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></p>
<p><span class=rvts7>ICQ: &nbsp; &nbsp;293-686-24</span></p>
<p><span class=rvts7>GSM:371-293-686-24</span></p>

</body></html>