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"
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 работать не будут.
--
Игорь Сысоев
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 {
|