Появляется "мусор" в response_body до и после "ожидаемого body"

Maxim Dounin mdounin at mdounin.ru
Tue Apr 7 12:38:50 MSD 2009


Hello!

On Tue, Apr 07, 2009 at 11:54:19AM +0400, Igor Sysoev wrote:

> On Mon, Apr 06, 2009 at 08:43:21PM +0400, bas-kam wrote:
> 
> > 
> >    03.04.09, 04:42, "Bogun Dmitriy" <vugluskr at vugluskr.org.ua>:
> > 
> >      В Птн, 03/04/2009 в 03:05 +0400, Anton Yuzhaninov пишет:
> > 
> > Bogun Dmitriy wrote:
> > > Ситуация следующая с ipb форума делается ajax запрос на "быстрое 
> > > редактирование" поста. В ответ возвращается страничка у которой в body в 
> > > начало и в конец добавлено несколько символов, которых не было в момент 
> > > отправки.(Чтобы это проверить я добавил сохранение сформированного 
> > > ответа в файл непосредственно перед отдачей клиенту). В начало body 
> > > добавляется "8366\n" в конец "\n0". Символы в начале изменяются, в 
> > > хвосте всегда 0. Количество символов не меняется...
> > 
> > Скорее всего из за баги в php-коде в ответ на HTTP/1.0 запрос от nginx
> > возвращается HTTP/1.1 ответ с chunked encoding
> > 
> > workaround - прописать в конфиге апача:
> > 
> > SetEnv force-response-1.0 1
> > 
> > В моём случае ни строчка выше, ни "BrowserMatch ".*" downgrade-1.0 force-respon
> > se-1.0" не помогли, т.е. мусор по прежнему отображается на страницах.
> > Естественно апач перегружал после добавления строчек. Строчки добавил в конец h
> > ttpd.conf (на всякий случай).
> > Так же "мусор" у меня прямо на главной странице. Всё это добро появилось после 
> > перехода на связку apache (2.2) + nginx (0.6.36). 
> 
> Патч для 0.7.50. Chunked ответ передаётся как есть.
> Некоторые фильтры работают не корректно:
> 1) gzip-фильтр такие ответы не сжимает;
> 2) SSI обрабатываться при условии, что команда не попадает на границу chunk'а;
> 3) sub_filter работает при условии, что заменяемая часть не попадает
>    на границу chunk'а;
> 4) XSLT, addition работать не будут.

Бррр.  Может лучше не трогать это место пока не появится 
нормальный разбор chunked?

Потому как я живо представляю в какую тыкву превратится ответ если 
по нему пройдётся ssi и/или sub_filter, изменив тем самым реальный 
размер чанка (но не поправив chunk-size).

Maxim Dounin

> 
> 
> -- 
> Игорь Сысоев
> http://sysoev.ru

> Index: src/http/ngx_http_request.h
> ===================================================================
> --- src/http/ngx_http_request.h	(revision 2004)
> +++ src/http/ngx_http_request.h	(working copy)
> @@ -468,6 +468,7 @@
>  
>      unsigned                          pipeline:1;
>      unsigned                          plain_http:1;
> +    unsigned                          no_chunked:1;
>      unsigned                          chunked:1;
>      unsigned                          header_only:1;
>      unsigned                          zero_body:1;
> Index: src/http/ngx_http_upstream.c
> ===================================================================
> --- src/http/ngx_http_upstream.c	(revision 2004)
> +++ src/http/ngx_http_upstream.c	(working copy)
> @@ -101,6 +101,8 @@
>      ngx_table_elt_t *h, ngx_uint_t offset);
>  static ngx_int_t ngx_http_upstream_copy_allow_ranges(ngx_http_request_t *r,
>      ngx_table_elt_t *h, ngx_uint_t offset);
> +static ngx_int_t ngx_http_upstream_copy_transfer_encoding(ngx_http_request_t *r,
> +    ngx_table_elt_t *h, ngx_uint_t offset);
>  
>  #if (NGX_HTTP_GZIP)
>  static ngx_int_t ngx_http_upstream_copy_content_encoding(ngx_http_request_t *r,
> @@ -236,6 +238,11 @@
>                   ngx_http_upstream_process_charset, 0,
>                   ngx_http_upstream_ignore_header_line, 0, 0 },
>  
> +    { ngx_string("Transfer-Encoding"),
> +                 ngx_http_upstream_process_header_line,
> +                 offsetof(ngx_http_upstream_headers_in_t, transfer_encoding),
> +                 ngx_http_upstream_copy_transfer_encoding, 0, 0 },
> +
>  #if (NGX_HTTP_GZIP)
>      { ngx_string("Content-Encoding"),
>                   ngx_http_upstream_process_header_line,
> @@ -3288,6 +3295,30 @@
>  }
>  
>  
> +static ngx_int_t
> +ngx_http_upstream_copy_transfer_encoding(ngx_http_request_t *r,
> +    ngx_table_elt_t *h, ngx_uint_t offset)
> +{
> +    ngx_table_elt_t  *ho;
> +
> +    ho = ngx_list_push(&r->headers_out.headers);
> +    if (ho == NULL) {
> +        return NGX_ERROR;
> +    }
> +
> +    *ho = *h;
> +
> +    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,
> +                         (u_char *) "chunked", 7 - 1)
> +        != NULL)
> +    {
> +        r->no_chunked = 1;
> +    }
> +
> +    return NGX_OK;
> +}
> +
> +
>  #if (NGX_HTTP_GZIP)
>  
>  static ngx_int_t
> Index: src/http/ngx_http_upstream.h
> ===================================================================
> --- src/http/ngx_http_upstream.h	(revision 2004)
> +++ src/http/ngx_http_upstream.h	(working copy)
> @@ -202,6 +202,7 @@
>      ngx_table_elt_t                 *location;
>      ngx_table_elt_t                 *accept_ranges;
>      ngx_table_elt_t                 *www_authenticate;
> +    ngx_table_elt_t                 *transfer_encoding;
>  
>  #if (NGX_HTTP_GZIP)
>      ngx_table_elt_t                 *content_encoding;
> Index: src/http/modules/ngx_http_gzip_filter_module.c
> ===================================================================
> --- src/http/modules/ngx_http_gzip_filter_module.c	(revision 2004)
> +++ src/http/modules/ngx_http_gzip_filter_module.c	(working copy)
> @@ -247,6 +247,7 @@
>              && r->headers_out.status != NGX_HTTP_FORBIDDEN
>              && r->headers_out.status != NGX_HTTP_NOT_FOUND)
>          || r->header_only
> +        || r->no_chunked
>          || (r->headers_out.content_encoding
>              && r->headers_out.content_encoding->value.len)
>          || (r->headers_out.content_length_n != -1
> Index: src/http/modules/ngx_http_chunked_filter_module.c
> ===================================================================
> --- src/http/modules/ngx_http_chunked_filter_module.c	(revision 2004)
> +++ src/http/modules/ngx_http_chunked_filter_module.c	(working copy)
> @@ -60,7 +60,7 @@
>      }
>  
>      if (r->headers_out.content_length_n == -1) {
> -        if (r->http_version < NGX_HTTP_VERSION_11) {
> +        if (r->http_version < NGX_HTTP_VERSION_11 || r->no_chunked) {
>              r->keepalive = 0;
>  
>          } else {






More information about the nginx-ru mailing list