aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2010-02-01 12:01:01 +0000
committerIgor Sysoev <igor@sysoev.ru>2010-02-01 12:01:01 +0000
commit8164f329fe7703c3abb7e73b0c456a5b1c032b64 (patch)
tree914f34e3d220b97cc228759b66821ccccd0868ca /src
parent4e20f24b5bfd103e1471d6eceea6c1c13ea6e9ea (diff)
downloadnginx-8164f329fe7703c3abb7e73b0c456a5b1c032b64.tar.gz
nginx-8164f329fe7703c3abb7e73b0c456a5b1c032b64.zip
disable keepalive for Safari:
https://bugs.webkit.org/show_bug.cgi?id=5760
Diffstat (limited to 'src')
-rw-r--r--src/http/ngx_http_core_module.c24
-rw-r--r--src/http/ngx_http_request.c3
-rw-r--r--src/http/ngx_http_request.h1
3 files changed, 21 insertions, 7 deletions
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index f3b62d9d4..78c141220 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -783,14 +783,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.msie) {
+ 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 9ca19f556..3432b50a0 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1450,6 +1450,9 @@ ngx_http_process_user_agent(ngx_http_request_t *r, ngx_table_elt_t *h,
} 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 79ec02873..902ec3ec1 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -220,6 +220,7 @@ typedef struct {
unsigned opera:1;
unsigned gecko:1;
unsigned chrome:1;
+ unsigned safari:1;
unsigned konqueror:1;
} ngx_http_headers_in_t;