Merge branch 'nginx' (nginx-1.19.5).
Change-Id: I7ae7d30680f3bd88016ff54b3eca6b269e059cc2
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
diff --git a/.hgtags b/.hgtags
index da0a246..dc8b8d8 100644
--- a/.hgtags
+++ b/.hgtags
@@ -454,3 +454,4 @@
a7b46539f507e6c64efa0efda69ad60b6f4ffbce release-1.19.2
3cbc2602325f0ac08917a4397d76f5155c34b7b1 release-1.19.3
dc0cc425fa63a80315f6efb68697cadb6626cdf2 release-1.19.4
+8e5b068f761cd512d10c9671fbde0b568c1fd08b release-1.19.5
diff --git a/BUILD b/BUILD
index b93a856..dd27c76 100644
--- a/BUILD
+++ b/BUILD
@@ -1536,5 +1536,5 @@
preinst = "@nginx_pkgoss//:debian_preinst",
prerm = "@nginx_pkgoss//:debian_prerm",
section = "httpd",
- version = "1.19.4",
+ version = "1.19.5",
)
diff --git a/auto/configure b/auto/configure
index 3284956..6a3b67f 100755
--- a/auto/configure
+++ b/auto/configure
@@ -90,6 +90,10 @@
have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . $NGX_AUTO/define
have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . $NGX_AUTO/define
+if [ ".$NGX_ERROR_LOG_PATH" = "." ]; then
+ have=NGX_ERROR_LOG_STDERR . $NGX_AUTO/have
+fi
+
have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . $NGX_AUTO/define
have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""
. $NGX_AUTO/define
diff --git a/auto/make b/auto/make
index 34c40cd..ef7c9f6 100644
--- a/auto/make
+++ b/auto/make
@@ -313,7 +313,7 @@
END
fi
- done
+ done
fi
@@ -343,7 +343,7 @@
$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
END
- done
+ done
fi
@@ -373,7 +373,7 @@
$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
END
- done
+ done
fi
@@ -399,7 +399,7 @@
$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
END
- done
+ done
fi
@@ -431,7 +431,7 @@
$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
END
- done
+ done
fi
@@ -502,6 +502,7 @@
for ngx_module in $DYNAMIC_MODULES
do
eval ngx_module_srcs="\$${ngx_module}_SRCS"
+ eval ngx_module_shrd="\$${ngx_module}_SHRD"
eval eval ngx_module_libs="\\\"\$${ngx_module}_LIBS\\\""
eval ngx_module_modules="\$${ngx_module}_MODULES"
@@ -567,7 +568,7 @@
| sed -e "s/\(.*\.\)c/\1$ngx_objext/"`
ngx_module_objs=
- for ngx_src in $ngx_module_srcs
+ for ngx_src in $ngx_module_srcs $ngx_module_shrd
do
case "$ngx_src" in
src/*)
diff --git a/auto/module b/auto/module
index a2b578d..3857d04 100644
--- a/auto/module
+++ b/auto/module
@@ -17,7 +17,6 @@
done
DYNAMIC_MODULES="$DYNAMIC_MODULES $ngx_module"
- eval ${ngx_module}_SRCS=\"$ngx_module_srcs\"
eval ${ngx_module}_MODULES=\"$ngx_module_name\"
@@ -31,6 +30,30 @@
eval ${ngx_module}_ORDER=\"$ngx_module_order\"
fi
+ srcs=
+ shrd=
+ for src in $ngx_module_srcs
+ do
+ found=no
+ for old in $DYNAMIC_MODULES_SRCS
+ do
+ if [ $src = $old ]; then
+ found=yes
+ break
+ fi
+ done
+
+ if [ $found = no ]; then
+ srcs="$srcs $src"
+ else
+ shrd="$shrd $src"
+ fi
+ done
+ eval ${ngx_module}_SRCS=\"$srcs\"
+ eval ${ngx_module}_SHRD=\"$shrd\"
+
+ DYNAMIC_MODULES_SRCS="$DYNAMIC_MODULES_SRCS $srcs"
+
if test -n "$ngx_module_incs"; then
CORE_INCS="$CORE_INCS $ngx_module_incs"
fi
@@ -107,7 +130,24 @@
eval ${ngx_module_type}_MODULES=\"\$${ngx_module_type}_MODULES \
$ngx_module_name\"
- NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_module_srcs"
+ srcs=
+ for src in $ngx_module_srcs
+ do
+ found=no
+ for old in $NGX_ADDON_SRCS
+ do
+ if [ $src = $old ]; then
+ found=yes
+ break
+ fi
+ done
+
+ if [ $found = no ]; then
+ srcs="$srcs $src"
+ fi
+ done
+
+ NGX_ADDON_SRCS="$NGX_ADDON_SRCS $srcs"
if test -n "$ngx_module_incs"; then
eval ${ngx_var}_INCS=\"\$${ngx_var}_INCS $ngx_module_incs\"
diff --git a/auto/options b/auto/options
index 2b80e64..c97398c 100644
--- a/auto/options
+++ b/auto/options
@@ -132,8 +132,10 @@
STREAM_SSL_PREREAD=NO
DYNAMIC_MODULES=
+DYNAMIC_MODULES_SRCS=
NGX_ADDONS=
+NGX_ADDON_SRCS=
NGX_ADDON_DEPS=
DYNAMIC_ADDONS=
diff --git a/build.bzl b/build.bzl
index 4fa5f96..7970e7f 100644
--- a/build.bzl
+++ b/build.bzl
@@ -673,9 +673,9 @@
name = "nginx_pkgoss",
build_file_content = _PKGOSS_BUILD_FILE.format(nginx = nginx) +
_PKGOSS_BUILD_FILE_TAIL,
- commit = "0d4cbab8a8ee0c010bface3e0b16945ffbdc0658", # nginx-1.19.4
+ commit = "2d2699f5a66808ac119f4509ceccd90d44ef2dfb", # nginx-1.19.5
remote = "https://nginx.googlesource.com/nginx-pkgoss",
- shallow_since = "1603812347 +0300",
+ shallow_since = "1606224304 +0300",
)
def nginx_repositories_zlib(bind):
diff --git a/docs/man/nginx.8 b/docs/man/nginx.8
index 573d935..10db3e6 100644
--- a/docs/man/nginx.8
+++ b/docs/man/nginx.8
@@ -25,7 +25,7 @@
.\" SUCH DAMAGE.
.\"
.\"
-.Dd December 5, 2019
+.Dd November 5, 2020
.Dt NGINX 8
.Os
.Sh NAME
@@ -35,6 +35,7 @@
.Nm
.Op Fl ?hqTtVv
.Op Fl c Ar file
+.Op Fl e Ar file
.Op Fl g Ar directives
.Op Fl p Ar prefix
.Op Fl s Ar signal
@@ -54,6 +55,12 @@
.It Fl c Ar file
Use an alternative configuration
.Ar file .
+.It Fl e Ar file
+Use an alternative error log
+.Ar file .
+Special value
+.Cm stderr
+indicates that the standard error output should be used.
.It Fl g Ar directives
Set global configuration directives.
See
@@ -198,10 +205,10 @@
started in 2002, with the first public release on October 4, 2004.
.Sh AUTHORS
.An -nosplit
-.An Igor Sysoev Aq igor@sysoev.ru .
+.An Igor Sysoev Aq Mt igor@sysoev.ru .
.Pp
This manual page was originally written by
-.An Sergey A. Osokin Aq osa@FreeBSD.org.ru
+.An Sergey A. Osokin Aq Mt osa@FreeBSD.org.ru
as a result of compiling many
.Nm
documents from all over the world.
diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml
index a7417f5..d1bd021 100644
--- a/docs/xml/nginx/changes.xml
+++ b/docs/xml/nginx/changes.xml
@@ -5,6 +5,62 @@
<change_log title="nginx">
+<changes ver="1.19.5" date="2020-11-24">
+
+<change type="feature">
+<para lang="ru">
+ключ -e.
+</para>
+<para lang="en">
+the -e switch.
+</para>
+</change>
+
+<change type="feature">
+<para lang="ru">
+при сборке дополнительных модулей
+теперь можно указывать одни и те же исходные файлы в разных модулях.
+</para>
+<para lang="en">
+the same source files can now be specified in different modules
+while building addon modules.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+SSL shutdown не работал
+при закрытии соединений с ожиданием дополнительных данных (lingering close).
+</para>
+<para lang="en">
+SSL shutdown did not work
+when lingering close was used.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+при работе с gRPC-бэкендами
+могли возникать ошибки "upstream sent frame for closed stream".
+</para>
+<para lang="en">
+"upstream sent frame for closed stream" errors might occur
+when working with gRPC backends.
+</para>
+</change>
+
+<change type="bugfix">
+<para lang="ru">
+во внутреннем API для обработки тела запроса.
+</para>
+<para lang="en">
+in request body filters internal API.
+</para>
+</change>
+
+</changes>
+
+
<changes ver="1.19.4" date="2020-10-27">
<change type="feature">
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 0730440..5977d33 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -187,6 +187,7 @@
static ngx_uint_t ngx_show_version;
static ngx_uint_t ngx_show_configure;
static u_char *ngx_prefix;
+static u_char *ngx_error_log;
static u_char *ngx_conf_file;
static u_char *ngx_conf_params;
static char *ngx_signal;
@@ -238,7 +239,7 @@
ngx_pid = ngx_getpid();
ngx_parent = ngx_getppid();
- log = ngx_log_init(ngx_prefix);
+ log = ngx_log_init(ngx_prefix, ngx_error_log);
if (log == NULL) {
return 1;
}
@@ -401,9 +402,9 @@
if (ngx_show_help) {
ngx_write_stderr(
- "Usage: nginx [-?hvVtTq] [-s signal] [-c filename] "
- "[-p prefix] [-g directives]" NGX_LINEFEED
- NGX_LINEFEED
+ "Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]" NGX_LINEFEED
+ " [-e filename] [-c filename] [-g directives]"
+ NGX_LINEFEED NGX_LINEFEED
"Options:" NGX_LINEFEED
" -?,-h : this help" NGX_LINEFEED
" -v : show version and exit" NGX_LINEFEED
@@ -422,6 +423,12 @@
#else
" -p prefix : set prefix path (default: NONE)" NGX_LINEFEED
#endif
+ " -e filename : set error log file (default: "
+#ifdef NGX_ERROR_LOG_STDERR
+ "stderr)" NGX_LINEFEED
+#else
+ NGX_ERROR_LOG_PATH ")" NGX_LINEFEED
+#endif
" -c filename : set configuration file (default: " NGX_CONF_PATH
")" NGX_LINEFEED
" -g directives : set global directives out of configuration "
@@ -816,6 +823,24 @@
ngx_log_stderr(0, "option \"-p\" requires directory name");
return NGX_ERROR;
+ case 'e':
+ if (*p) {
+ ngx_error_log = p;
+
+ } else if (argv[++i]) {
+ ngx_error_log = (u_char *) argv[i];
+
+ } else {
+ ngx_log_stderr(0, "option \"-e\" requires file name");
+ return NGX_ERROR;
+ }
+
+ if (ngx_strcmp(ngx_error_log, "stderr") == 0) {
+ ngx_error_log = (u_char *) "";
+ }
+
+ goto next;
+
case 'c':
if (*p) {
ngx_conf_file = p;
@@ -1008,6 +1033,14 @@
}
}
+ if (ngx_error_log) {
+ cycle->error_log.len = ngx_strlen(ngx_error_log);
+ cycle->error_log.data = ngx_error_log;
+
+ } else {
+ ngx_str_set(&cycle->error_log, NGX_ERROR_LOG_PATH);
+ }
+
if (ngx_conf_params) {
cycle->conf_param.len = ngx_strlen(ngx_conf_params);
cycle->conf_param.data = ngx_conf_params;
diff --git a/src/core/nginx.h b/src/core/nginx.h
index d84fe5b..04710fd 100644
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -13,8 +13,8 @@
#define NGINX_NAME "nginx"
#endif
-#define nginx_version 1019004
-#define NGINX_VERSION "1.19.4"
+#define nginx_version 1019005
+#define NGINX_VERSION "1.19.5"
#define NGINX_VER NGINX_NAME "/" NGINX_VERSION
#ifdef NGX_BUILD
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c
index d7479fa..6978c3e 100644
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -96,6 +96,15 @@
return NULL;
}
+ cycle->error_log.len = old_cycle->error_log.len;
+ cycle->error_log.data = ngx_pnalloc(pool, old_cycle->error_log.len + 1);
+ if (cycle->error_log.data == NULL) {
+ ngx_destroy_pool(pool);
+ return NULL;
+ }
+ ngx_cpystrn(cycle->error_log.data, old_cycle->error_log.data,
+ old_cycle->error_log.len + 1);
+
cycle->conf_file.len = old_cycle->conf_file.len;
cycle->conf_file.data = ngx_pnalloc(pool, old_cycle->conf_file.len + 1);
if (cycle->conf_file.data == NULL) {
diff --git a/src/core/ngx_cycle.h b/src/core/ngx_cycle.h
index f24ec43..b40491d 100644
--- a/src/core/ngx_cycle.h
+++ b/src/core/ngx_cycle.h
@@ -80,6 +80,7 @@
ngx_str_t conf_param;
ngx_str_t conf_prefix;
ngx_str_t prefix;
+ ngx_str_t error_log;
ngx_str_t lock_file;
ngx_str_t hostname;
};
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index 8e9408d..0c09426 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -315,7 +315,7 @@
ngx_log_t *
-ngx_log_init(u_char *prefix)
+ngx_log_init(u_char *prefix, u_char *error_log)
{
u_char *p, *name;
size_t nlen, plen;
@@ -323,13 +323,11 @@
ngx_log.file = &ngx_log_file;
ngx_log.log_level = NGX_LOG_NOTICE;
- name = (u_char *) NGX_ERROR_LOG_PATH;
+ if (error_log == NULL) {
+ error_log = (u_char *) NGX_ERROR_LOG_PATH;
+ }
- /*
- * we use ngx_strlen() here since BCC warns about
- * condition is always false and unreachable code
- */
-
+ name = error_log;
nlen = ngx_strlen(name);
if (nlen == 0) {
@@ -369,7 +367,7 @@
*p++ = '/';
}
- ngx_cpystrn(p, (u_char *) NGX_ERROR_LOG_PATH, nlen + 1);
+ ngx_cpystrn(p, error_log, nlen + 1);
p = name;
}
@@ -403,8 +401,7 @@
ngx_int_t
ngx_log_open_default(ngx_cycle_t *cycle)
{
- ngx_log_t *log;
- static ngx_str_t error_log = ngx_string(NGX_ERROR_LOG_PATH);
+ ngx_log_t *log;
if (ngx_log_get_file_log(&cycle->new_log) != NULL) {
return NGX_OK;
@@ -425,7 +422,7 @@
log->log_level = NGX_LOG_ERR;
- log->file = ngx_conf_open_file(cycle, &error_log);
+ log->file = ngx_conf_open_file(cycle, &cycle->error_log);
if (log->file == NULL) {
return NGX_ERROR;
}
diff --git a/src/core/ngx_log.h b/src/core/ngx_log.h
index afb73bf..ab64a5a 100644
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -228,7 +228,7 @@
/*********************************/
-ngx_log_t *ngx_log_init(u_char *prefix);
+ngx_log_t *ngx_log_init(u_char *prefix, u_char *error_log);
void ngx_cdecl ngx_log_abort(ngx_err_t err, const char *fmt, ...);
void ngx_cdecl ngx_log_stderr(ngx_err_t err, const char *fmt, ...);
u_char *ngx_log_errno(u_char *buf, u_char *last, ngx_err_t err);
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 468e960..93f32ea 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -11,6 +11,8 @@
static u_char *ngx_sprintf_num(u_char *buf, u_char *last, uint64_t ui64,
u_char zero, ngx_uint_t hexadecimal, ngx_uint_t width);
+static u_char *ngx_sprintf_str(u_char *buf, u_char *last, u_char *src,
+ size_t len, ngx_uint_t hexadecimal);
static void ngx_encode_base64_internal(ngx_str_t *dst, ngx_str_t *src,
const u_char *basis, ngx_uint_t padding);
static ngx_int_t ngx_decode_base64_internal(ngx_str_t *dst, ngx_str_t *src,
@@ -101,10 +103,10 @@
* %M ngx_msec_t
* %r rlim_t
* %p void *
- * %V ngx_str_t *
- * %v ngx_variable_value_t *
- * %s null-terminated string
- * %*s length and string
+ * %[x|X]V ngx_str_t *
+ * %[x|X]v ngx_variable_value_t *
+ * %[x|X]s null-terminated string
+ * %*[x|X]s length and string
* %Z '\0'
* %N '\n'
* %c char
@@ -165,7 +167,7 @@
u_char *p, zero;
int d;
double f;
- size_t len, slen;
+ size_t slen;
int64_t i64;
uint64_t ui64, frac;
ngx_msec_t ms;
@@ -250,8 +252,7 @@
case 'V':
v = va_arg(args, ngx_str_t *);
- len = ngx_min(((size_t) (last - buf)), v->len);
- buf = ngx_cpymem(buf, v->data, len);
+ buf = ngx_sprintf_str(buf, last, v->data, v->len, hex);
fmt++;
continue;
@@ -259,8 +260,7 @@
case 'v':
vv = va_arg(args, ngx_variable_value_t *);
- len = ngx_min(((size_t) (last - buf)), vv->len);
- buf = ngx_cpymem(buf, vv->data, len);
+ buf = ngx_sprintf_str(buf, last, vv->data, vv->len, hex);
fmt++;
continue;
@@ -268,16 +268,7 @@
case 's':
p = va_arg(args, u_char *);
- if (slen == (size_t) -1) {
- while (*p && buf < last) {
- *buf++ = *p++;
- }
-
- } else {
- len = ngx_min(((size_t) (last - buf)), slen);
- buf = ngx_cpymem(buf, p, len);
- }
-
+ buf = ngx_sprintf_str(buf, last, p, slen, hex);
fmt++;
continue;
@@ -576,6 +567,64 @@
}
+static u_char *
+ngx_sprintf_str(u_char *buf, u_char *last, u_char *src, size_t len,
+ ngx_uint_t hexadecimal)
+{
+ static u_char hex[] = "0123456789abcdef";
+ static u_char HEX[] = "0123456789ABCDEF";
+
+ if (hexadecimal == 0) {
+
+ if (len == (size_t) -1) {
+ while (*src && buf < last) {
+ *buf++ = *src++;
+ }
+
+ } else {
+ len = ngx_min((size_t) (last - buf), len);
+ buf = ngx_cpymem(buf, src, len);
+ }
+
+ } else if (hexadecimal == 1) {
+
+ if (len == (size_t) -1) {
+
+ while (*src && buf < last - 1) {
+ *buf++ = hex[*src >> 4];
+ *buf++ = hex[*src++ & 0xf];
+ }
+
+ } else {
+
+ while (len-- && buf < last - 1) {
+ *buf++ = hex[*src >> 4];
+ *buf++ = hex[*src++ & 0xf];
+ }
+ }
+
+ } else { /* hexadecimal == 2 */
+
+ if (len == (size_t) -1) {
+
+ while (*src && buf < last - 1) {
+ *buf++ = HEX[*src >> 4];
+ *buf++ = HEX[*src++ & 0xf];
+ }
+
+ } else {
+
+ while (len-- && buf < last - 1) {
+ *buf++ = HEX[*src >> 4];
+ *buf++ = HEX[*src++ & 0xf];
+ }
+ }
+ }
+
+ return buf;
+}
+
+
/*
* We use ngx_strcasecmp()/ngx_strncasecmp() for 7-bit ASCII strings only,
* and implement our own ngx_strcasecmp()/ngx_strncasecmp()
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index d32aba0..2e739c8 100644
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -4083,9 +4083,6 @@
ngx_ssl_session_ticket_key_t *key;
const EVP_MD *digest;
const EVP_CIPHER *cipher;
-#if (NGX_DEBUG)
- u_char buf[32];
-#endif
c = ngx_ssl_get_connection(ssl_conn);
ssl_ctx = c->ssl->session_ctx;
@@ -4107,8 +4104,8 @@
/* encrypt session ticket */
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "ssl session ticket encrypt, key: \"%*s\" (%s session)",
- ngx_hex_dump(buf, key[0].name, 16) - buf, buf,
+ "ssl session ticket encrypt, key: \"%*xs\" (%s session)",
+ (size_t) 16, key[0].name,
SSL_session_reused(ssl_conn) ? "reused" : "new");
if (key[0].size == 48) {
@@ -4154,17 +4151,16 @@
}
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "ssl session ticket decrypt, key: \"%*s\" not found",
- ngx_hex_dump(buf, name, 16) - buf, buf);
+ "ssl session ticket decrypt, key: \"%*xs\" not found",
+ (size_t) 16, name);
return 0;
found:
ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
- "ssl session ticket decrypt, key: \"%*s\"%s",
- ngx_hex_dump(buf, key[i].name, 16) - buf, buf,
- (i == 0) ? " (default)" : "");
+ "ssl session ticket decrypt, key: \"%*xs\"%s",
+ (size_t) 16, key[i].name, (i == 0) ? " (default)" : "");
if (key[i].size == 48) {
cipher = EVP_aes_128_cbc();
diff --git a/src/event/ngx_event_openssl_stapling.c b/src/event/ngx_event_openssl_stapling.c
index 9d92421..e3fa8c4 100644
--- a/src/event/ngx_event_openssl_stapling.c
+++ b/src/event/ngx_event_openssl_stapling.c
@@ -2662,16 +2662,8 @@
p = ngx_cpymem(p, serial->data, serial->length);
ngx_memzero(p, 20 - serial->length);
-#if (NGX_DEBUG)
- {
- u_char buf[120];
-
- ngx_hex_dump(buf, ctx->key.data, ctx->key.len);
-
- ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ctx->log, 0,
- "ssl ocsp key %*s", sizeof(buf), buf);
- }
-#endif
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0,
+ "ssl ocsp key %xV", &ctx->key);
return NGX_OK;
}
diff --git a/src/http/modules/ngx_http_grpc_module.c b/src/http/modules/ngx_http_grpc_module.c
index 7e14af8..aa75765 100644
--- a/src/http/modules/ngx_http_grpc_module.c
+++ b/src/http/modules/ngx_http_grpc_module.c
@@ -1141,20 +1141,11 @@
f->flags |= NGX_HTTP_V2_END_HEADERS_FLAG;
-#if (NGX_DEBUG)
- if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
- u_char buf[512];
- size_t n, m;
-
- n = ngx_min(b->last - b->pos, 256);
- m = ngx_hex_dump(buf, b->pos, n) - buf;
-
- ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
- "grpc header: %*s%s, len: %uz",
- m, buf, b->last - b->pos > 256 ? "..." : "",
- b->last - b->pos);
- }
-#endif
+ ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "grpc header: %*xs%s, len: %uz",
+ (size_t) ngx_min(b->last - b->pos, 256), b->pos,
+ b->last - b->pos > 256 ? "..." : "",
+ b->last - b->pos);
if (r->request_body_no_buffering) {
@@ -1604,20 +1595,11 @@
u = r->upstream;
b = &u->buffer;
-#if (NGX_DEBUG)
- if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
- u_char buf[512];
- size_t n, m;
-
- n = ngx_min(b->last - b->pos, 256);
- m = ngx_hex_dump(buf, b->pos, n) - buf;
-
- ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
- "grpc response: %*s%s, len: %uz",
- m, buf, b->last - b->pos > 256 ? "..." : "",
- b->last - b->pos);
- }
-#endif
+ ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+ "grpc response: %*xs%s, len: %uz",
+ (size_t) ngx_min(b->last - b->pos, 256),
+ b->pos, b->last - b->pos > 256 ? "..." : "",
+ b->last - b->pos);
ctx = ngx_http_grpc_get_ctx(r);
@@ -1987,6 +1969,7 @@
}
u->length = 0;
+ ctx->done = 1;
} else {
u->length = 1;
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index 35ef12d..cc822c4 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -49,7 +49,7 @@
static void ngx_http_set_keepalive(ngx_http_request_t *r);
static void ngx_http_keepalive_handler(ngx_event_t *ev);
-static void ngx_http_set_lingering_close(ngx_http_request_t *r);
+static void ngx_http_set_lingering_close(ngx_connection_t *c);
static void ngx_http_lingering_close_handler(ngx_event_t *ev);
static ngx_int_t ngx_http_post_action(ngx_http_request_t *r);
static void ngx_http_close_request(ngx_http_request_t *r, ngx_int_t error);
@@ -2934,7 +2934,7 @@
|| r->header_in->pos < r->header_in->last
|| r->connection->read->ready)))
{
- ngx_http_set_lingering_close(r);
+ ngx_http_set_lingering_close(r->connection);
return;
}
@@ -3219,13 +3219,6 @@
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "set http keepalive handler");
- if (r->discard_body) {
- r->write_event_handler = ngx_http_request_empty_handler;
- r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);
- ngx_add_timer(rev, clcf->lingering_timeout);
- return;
- }
-
c->log->action = "closing request";
hc = r->http_connection;
@@ -3555,22 +3548,43 @@
static void
-ngx_http_set_lingering_close(ngx_http_request_t *r)
+ngx_http_set_lingering_close(ngx_connection_t *c)
{
ngx_event_t *rev, *wev;
- ngx_connection_t *c;
+ ngx_http_request_t *r;
ngx_http_core_loc_conf_t *clcf;
- c = r->connection;
+ r = c->data;
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+ if (r->lingering_time == 0) {
+ r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);
+ }
+
+#if (NGX_HTTP_SSL)
+ if (c->ssl) {
+ ngx_int_t rc;
+
+ rc = ngx_ssl_shutdown(c);
+
+ if (rc == NGX_ERROR) {
+ ngx_http_close_request(r, 0);
+ return;
+ }
+
+ if (rc == NGX_AGAIN) {
+ c->ssl->handler = ngx_http_set_lingering_close;
+ return;
+ }
+
+ c->recv = ngx_recv;
+ }
+#endif
+
rev = c->read;
rev->handler = ngx_http_lingering_close_handler;
- r->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);
- ngx_add_timer(rev, clcf->lingering_timeout);
-
if (ngx_handle_read_event(rev, 0) != NGX_OK) {
ngx_http_close_request(r, 0);
return;
@@ -3593,6 +3607,8 @@
return;
}
+ ngx_add_timer(rev, clcf->lingering_timeout);
+
if (rev->ready) {
ngx_http_lingering_close_handler(rev);
}
diff --git a/src/http/ngx_http_request_body.c b/src/http/ngx_http_request_body.c
index 71d7e9a..0cae88f 100644
--- a/src/http/ngx_http_request_body.c
+++ b/src/http/ngx_http_request_body.c
@@ -137,8 +137,9 @@
} else {
/* set rb->rest */
- if (ngx_http_request_body_filter(r, NULL) != NGX_OK) {
- rc = NGX_HTTP_INTERNAL_SERVER_ERROR;
+ rc = ngx_http_request_body_filter(r, NULL);
+
+ if (rc != NGX_OK) {
goto done;
}
}
@@ -305,6 +306,9 @@
return NGX_AGAIN;
}
+ ngx_log_error(NGX_LOG_ALERT, c->log, 0,
+ "busy buffers after request body flush");
+
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
@@ -674,6 +678,7 @@
if (rc == NGX_OK) {
r->discard_body = 0;
r->lingering_close = 0;
+ r->lingering_time = 0;
ngx_http_finalize_request(r, NGX_DONE);
return;
}
diff --git a/src/http/v2/ngx_http_v2.c b/src/http/v2/ngx_http_v2.c
index 1dfd7d2..97fd5e4 100644
--- a/src/http/v2/ngx_http_v2.c
+++ b/src/http/v2/ngx_http_v2.c
@@ -61,7 +61,7 @@
static void ngx_http_v2_read_handler(ngx_event_t *rev);
static void ngx_http_v2_write_handler(ngx_event_t *wev);
static void ngx_http_v2_handle_connection(ngx_http_v2_connection_t *h2c);
-static void ngx_http_v2_lingering_close(ngx_http_v2_connection_t *h2c);
+static void ngx_http_v2_lingering_close(ngx_connection_t *c);
static void ngx_http_v2_lingering_close_handler(ngx_event_t *rev);
static u_char *ngx_http_v2_state_proxy_protocol(ngx_http_v2_connection_t *h2c,
@@ -665,7 +665,7 @@
}
if (h2c->goaway) {
- ngx_http_v2_lingering_close(h2c);
+ ngx_http_v2_lingering_close(c);
return;
}
@@ -704,13 +704,13 @@
static void
-ngx_http_v2_lingering_close(ngx_http_v2_connection_t *h2c)
+ngx_http_v2_lingering_close(ngx_connection_t *c)
{
ngx_event_t *rev, *wev;
- ngx_connection_t *c;
+ ngx_http_v2_connection_t *h2c;
ngx_http_core_loc_conf_t *clcf;
- c = h2c->connection;
+ h2c = c->data;
clcf = ngx_http_get_module_loc_conf(h2c->http_connection->conf_ctx,
ngx_http_core_module);
@@ -720,12 +720,34 @@
return;
}
+ if (h2c->lingering_time == 0) {
+ h2c->lingering_time = ngx_time()
+ + (time_t) (clcf->lingering_time / 1000);
+ }
+
+#if (NGX_HTTP_SSL)
+ if (c->ssl) {
+ ngx_int_t rc;
+
+ rc = ngx_ssl_shutdown(c);
+
+ if (rc == NGX_ERROR) {
+ ngx_http_close_connection(c);
+ return;
+ }
+
+ if (rc == NGX_AGAIN) {
+ c->ssl->handler = ngx_http_v2_lingering_close;
+ return;
+ }
+
+ c->recv = ngx_recv;
+ }
+#endif
+
rev = c->read;
rev->handler = ngx_http_v2_lingering_close_handler;
- h2c->lingering_time = ngx_time() + (time_t) (clcf->lingering_time / 1000);
- ngx_add_timer(rev, clcf->lingering_timeout);
-
if (ngx_handle_read_event(rev, 0) != NGX_OK) {
ngx_http_close_connection(c);
return;
@@ -748,6 +770,8 @@
return;
}
+ ngx_add_timer(rev, clcf->lingering_timeout);
+
if (rev->ready) {
ngx_http_v2_lingering_close_handler(rev);
}
@@ -4806,7 +4830,7 @@
return;
}
- ngx_http_v2_lingering_close(h2c);
+ ngx_http_v2_lingering_close(c);
}