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