ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
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 {


 




Copyright © Lexa Software, 1996-2009.