summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-06-04 17:47:04 +0000
committerIgor Sysoev <igor@sysoev.ru>2010-06-04 17:47:04 +0000
commit575d563e22c09442c3f2f4537ee0f51ccf28d271 (patch)
treee113849c4ab6ba4842cc9e24e3cb342ef3a9c11c
parent0a3498289db56ee688434c0d5ade4483521e6f62 (diff)
downloadnginx-575d563e22c09442c3f2f4537ee0f51ccf28d271.tar.gz
merge r3316, r3317, r3420, r3421, r3453:
browsers related fixes: *) add MSIE padding for Chrome too *) disable keepalive for Safari: https://bugs.webkit.org/show_bug.cgi?id=5760 *) do not disable keepalive after POST requests for MSIE 7+
-rw-r--r--src/http/ngx_http_core_module.c24
-rw-r--r--src/http/ngx_http_request.c6
-rw-r--r--src/http/ngx_http_request.h2
-rw-r--r--src/http/ngx_http_special_response.c22
4 files changed, 36 insertions, 18 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index 7bb3ad25c..b0ede943b 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -744,14 +744,24 @@ ngx_http_handler(ngx_http_request_t *r)
break;
}
- if (r->keepalive && r->headers_in.msie && r->method == NGX_HTTP_POST) {
-
- /*
- * MSIE may wait for some time if an response for
- * a POST request was sent over a keepalive connection
- */
+ if (r->keepalive) {
+
+ if (r->headers_in.msie6) {
+ if (r->method == NGX_HTTP_POST) {
+ /*
+ * MSIE may wait for some time if an response for
+ * a POST request was sent over a keepalive connection
+ */
+ r->keepalive = 0;
+ }
- r->keepalive = 0;
+ } else if (r->headers_in.safari) {
+ /*
+ * Safari may send a POST request to a closed keepalive
+ * connection and stalls for some time
+ */
+ r->keepalive = 0;
+ }
}
if (r->headers_in.content_length_n > 0) {
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index c239b9d34..c32f4c6b1 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1443,6 +1443,12 @@ ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h,
if (ngx_strstrn(user_agent, "Gecko/", 6 - 1)) {
r->headers_in.gecko = 1;
+ } else if (ngx_strstrn(user_agent, "Chrome/", 7 - 1)) {
+ r->headers_in.chrome = 1;
+
+ } else if (ngx_strstrn(user_agent, "Safari/", 7 - 1)) {
+ r->headers_in.safari = 1;
+
} else if (ngx_strstrn(user_agent, "Konqueror", 9 - 1)) {
r->headers_in.konqueror = 1;
}
diff --git a/src/http/ngx_http_request.h b/src/http/ngx_http_request.h
index 974020ef8..3772e81b0 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -220,6 +220,8 @@ typedef struct {
unsigned msie6:1;
unsigned opera:1;
unsigned gecko:1;
+ unsigned chrome:1;
+ unsigned safari:1;
unsigned konqueror:1;
} ngx_http_headers_in_t;
diff --git a/src/http/ngx_http_special_response.c b/src/http/ngx_http_special_response.c
index 62f71a3ef..060cc9934 100644
--- a/src/http/ngx_http_special_response.c
+++ b/src/http/ngx_http_special_response.c
@@ -31,13 +31,13 @@ static u_char ngx_http_error_tail[] =
;
-static u_char ngx_http_msie_stub[] =
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
-"<!-- The padding to disable MSIE's friendly error page -->" CRLF
+static u_char ngx_http_msie_padding[] =
+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
+"<!-- a padding to disable MSIE and Chrome friendly error page -->" CRLF
;
@@ -598,12 +598,12 @@ ngx_http_send_special_response(ngx_http_request_t *r,
r->headers_out.content_length_n = ngx_http_error_pages[err].len
+ len;
if (clcf->msie_padding
- && r->headers_in.msie
+ && (r->headers_in.msie || r->headers_in.chrome)
&& r->http_version >= NGX_HTTP_VERSION_10
&& err >= NGX_HTTP_LEVEL_300)
{
r->headers_out.content_length_n +=
- sizeof(ngx_http_msie_stub) - 1;
+ sizeof(ngx_http_msie_padding) - 1;
msie_padding = 1;
}
@@ -671,8 +671,8 @@ ngx_http_send_special_response(ngx_http_request_t *r,
}
b->memory = 1;
- b->pos = ngx_http_msie_stub;
- b->last = ngx_http_msie_stub + sizeof(ngx_http_msie_stub) - 1;
+ b->pos = ngx_http_msie_padding;
+ b->last = ngx_http_msie_padding + sizeof(ngx_http_msie_padding) - 1;
out[1].next = &out[2];
out[2].buf = b;