disable keepalive for Safari:
https://bugs.webkit.org/show_bug.cgi?id=5760
diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
index f3b62d9..78c1412 100644
--- a/src/http/ngx_http_core_module.c
+++ b/src/http/ngx_http_core_module.c
@@ -783,14 +783,24 @@
break;
}
- if (r->keepalive && r->headers_in.msie && r->method == NGX_HTTP_POST) {
+ if (r->keepalive) {
- /*
- * MSIE may wait for some time if an response for
- * a POST request was sent over a keepalive connection
- */
+ 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 9ca19f5..3432b50 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -1450,6 +1450,9 @@
} 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 79ec028..902ec3e 100644
--- a/src/http/ngx_http_request.h
+++ b/src/http/ngx_http_request.h
@@ -220,6 +220,7 @@
unsigned opera:1;
unsigned gecko:1;
unsigned chrome:1;
+ unsigned safari:1;
unsigned konqueror:1;
} ngx_http_headers_in_t;