nginx-0.7.18
Maxim Dounin
mdounin at mdounin.ru
Mon Oct 13 20:11:58 MSD 2008
Hello!
On Mon, Oct 13, 2008 at 06:59:14PM +0400, Igor Sysoev wrote:
[...]
> > А вот это зачем? Буфер всё равно не передаётся следующим
> > фильтрам, мы это с тобой обсуждали на hl++.
> >
> > % --- a/src/http/modules/ngx_http_range_filter_module.c
> > % +++ b/src/http/modules/ngx_http_range_filter_module.c
> > % @@ -654,7 +654,13 @@ ngx_http_range_singlepart_body(ngx_http_
> > % ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
> > % "http range body skip");
> > %
> > % + if (buf->in_file) {
> > % + buf->file_pos = buf->file_last;
> > % + }
> > % +
> > % buf->pos = buf->last;
> > % + buf->sync = 1;
> > % +
> > % continue;
> > % }
> >
> > Ну то есть не то чтобы это чему-то мешает, но смысл?
>
> Это более правильное поведение. Тот кто передал этот буфер, может ожидать,
> что он передан, только после того, как file_pos == file_last.
Что-то мне подсказывает, что что "тот кто" при подобном ожидании
сломается в первом же попавшемся на пути фильтре, хоть как-то
модифицирующем ответ (e.g. charset, gzip, ...). :)
IMHO всё-таки такие проверки надо делать так же, как это делает
copy filter - через ngx_buf_size() == 0. Заставлять же все
фильтры, в том числе работающие только с буферами в памяти, знать
о наличии файловых позиций - это как-то черезчур. Впрочем, это
всё подробности, можно и забить.
BTW, ты в курсе что intercept_404 теперь работает только если
включён proxy_next_upstream http_404, а для конфиграции по
умолчанию - запрос к несуществующему ключу в memcached мрёт только
по таймауту? Патч прилагается.
Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1223802906 -14400
# Node ID 5581abe52a2e39661d83baa9e2dc2b5b47be3f81
# Parent 056521edbbad23260c442146e1a094d2adb1d723
Upstream: unbreak intercept_404.
We should honor intercept_404 even if no http_404 specified in
proxy_next_upstream directive.
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -1376,11 +1376,6 @@ ngx_http_upstream_test_next(ngx_http_req
return NGX_OK;
}
- if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {
- ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);
- return NGX_OK;
- }
-
#if (NGX_HTTP_CACHE)
if (u->peer.tries == 0 && u->stale && (u->conf->use_stale & un->mask)) {
@@ -1406,6 +1401,13 @@ ngx_http_upstream_intercept_errors(ngx_h
ngx_http_err_page_t *err_page;
ngx_http_core_loc_conf_t *clcf;
+ status = u->headers_in.status_n;
+
+ if (status == NGX_HTTP_NOT_FOUND && u->conf->intercept_404) {
+ ngx_http_upstream_finalize_request(r, u, NGX_HTTP_NOT_FOUND);
+ return NGX_OK;
+ }
+
if (!u->conf->intercept_errors) {
return NGX_DECLINED;
}
@@ -1415,8 +1417,6 @@ ngx_http_upstream_intercept_errors(ngx_h
if (clcf->error_pages == NULL) {
return NGX_DECLINED;
}
-
- status = u->headers_in.status_n;
err_page = clcf->error_pages->elts;
for (i = 0; i < clcf->error_pages->nelts; i++) {
More information about the nginx-ru
mailing list