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