Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Появляется "мусор" в response_body до и после "ожидаемого body"
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@xxxxxxxxxxxxxxx>:
> >
> > В Птн, 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 {
|