diff options
-rw-r--r-- | src/core/ngx_connection.c | 11 | ||||
-rw-r--r-- | src/core/ngx_connection.h | 7 | ||||
-rw-r--r-- | src/http/ngx_http_request.c | 7 |
3 files changed, 19 insertions, 6 deletions
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c index f48eefbb0..804ab0916 100644 --- a/src/core/ngx_connection.c +++ b/src/core/ngx_connection.c @@ -782,12 +782,16 @@ ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text) { ngx_uint_t level; - if (err == NGX_ECONNRESET - && c->log_error == NGX_ERROR_IGNORE_ECONNRESET) - { + if (err == NGX_ECONNRESET && c->log_error == NGX_ERROR_IGNORE_ECONNRESET) { return 0; } +#if (NGX_SOLARIS) + if (err == NGX_EINVAL && c->log_error == NGX_ERROR_IGNORE_EINVAL) { + return 0; + } +#endif + if (err == 0 || err == NGX_ECONNRESET #if !(NGX_WIN32) @@ -803,6 +807,7 @@ ngx_connection_error(ngx_connection_t *c, ngx_err_t err, char *text) { switch (c->log_error) { + case NGX_ERROR_IGNORE_EINVAL: case NGX_ERROR_IGNORE_ECONNRESET: case NGX_ERROR_INFO: level = NGX_LOG_INFO; diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h index d9b80f941..171078b23 100644 --- a/src/core/ngx_connection.h +++ b/src/core/ngx_connection.h @@ -69,10 +69,11 @@ struct ngx_listening_s { typedef enum { - NGX_ERROR_CRIT = 0, + NGX_ERROR_ALERT = 0, NGX_ERROR_ERR, NGX_ERROR_INFO, - NGX_ERROR_IGNORE_ECONNRESET + NGX_ERROR_IGNORE_ECONNRESET, + NGX_ERROR_IGNORE_EINVAL } ngx_connection_log_error_e; @@ -131,7 +132,7 @@ struct ngx_connection_s { unsigned buffered:8; - unsigned log_error:2; /* ngx_connection_log_error_e */ + unsigned log_error:3; /* ngx_connection_log_error_e */ unsigned single_connection:1; unsigned unexpected_eof:1; diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c index c018d6868..fbe088711 100644 --- a/src/http/ngx_http_request.c +++ b/src/http/ngx_http_request.c @@ -2421,8 +2421,15 @@ ngx_http_set_keepalive(ngx_http_request_t *r) (const void *) &tcp_nodelay, sizeof(int)) == -1) { +#if (NGX_SOLARIS) + /* Solaris returns EINVAL if a socket has been shut down */ + c->log_error = NGX_ERROR_IGNORE_EINVAL; +#endif + ngx_connection_error(c, ngx_socket_errno, "setsockopt(TCP_NODELAY) failed"); + + c->log_error = NGX_ERROR_INFO; ngx_http_close_connection(c); return; } |