diff options
author | Igor Sysoev <igor@sysoev.ru> | 2010-02-01 12:01:01 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2010-02-01 12:01:01 +0000 |
commit | 8164f329fe7703c3abb7e73b0c456a5b1c032b64 (patch) | |
tree | 914f34e3d220b97cc228759b66821ccccd0868ca /src | |
parent | 4e20f24b5bfd103e1471d6eceea6c1c13ea6e9ea (diff) | |
download | nginx-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.c | 24 | ||||
-rw-r--r-- | src/http/ngx_http_request.c | 3 | ||||
-rw-r--r-- | src/http/ngx_http_request.h | 1 |
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; |