118 lines
4.1 KiB
C
118 lines
4.1 KiB
C
|
diff --git a/src/http/modules/ngx_http_log_module.c b/src/http/modules/ngx_http_log_module.c
|
||
|
index 917ed55f..b769dfd3 100644
|
||
|
--- a/src/http/modules/ngx_http_log_module.c
|
||
|
+++ b/src/http/modules/ngx_http_log_module.c
|
||
|
@@ -79,6 +79,8 @@ typedef struct {
|
||
|
time_t open_file_cache_valid;
|
||
|
ngx_uint_t open_file_cache_min_uses;
|
||
|
|
||
|
+ ngx_flag_t escape_non_ascii;
|
||
|
+
|
||
|
ngx_uint_t off; /* unsigned off:1 */
|
||
|
} ngx_http_log_loc_conf_t;
|
||
|
|
||
|
@@ -131,7 +133,8 @@ static size_t ngx_http_log_variable_getlen(ngx_http_request_t *r,
|
||
|
uintptr_t data);
|
||
|
static u_char *ngx_http_log_variable(ngx_http_request_t *r, u_char *buf,
|
||
|
ngx_http_log_op_t *op);
|
||
|
-static uintptr_t ngx_http_log_escape(u_char *dst, u_char *src, size_t size);
|
||
|
+static uintptr_t ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst,
|
||
|
+ u_char *src, size_t size);
|
||
|
static size_t ngx_http_log_json_variable_getlen(ngx_http_request_t *r,
|
||
|
uintptr_t data);
|
||
|
static u_char *ngx_http_log_json_variable(ngx_http_request_t *r, u_char *buf,
|
||
|
@@ -177,6 +180,13 @@ static ngx_command_t ngx_http_log_commands[] = {
|
||
|
0,
|
||
|
NULL },
|
||
|
|
||
|
+ { ngx_string("log_escape_non_ascii"),
|
||
|
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
|
||
|
+ ngx_conf_set_flag_slot,
|
||
|
+ NGX_HTTP_LOC_CONF_OFFSET,
|
||
|
+ offsetof(ngx_http_log_loc_conf_t, escape_non_ascii),
|
||
|
+ NULL },
|
||
|
+
|
||
|
ngx_null_command
|
||
|
};
|
||
|
|
||
|
@@ -935,6 +945,7 @@ static size_t
|
||
|
ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||
|
{
|
||
|
uintptr_t len;
|
||
|
+ ngx_http_log_loc_conf_t *lcf;
|
||
|
ngx_http_variable_value_t *value;
|
||
|
|
||
|
value = ngx_http_get_indexed_variable(r, data);
|
||
|
@@ -943,7 +954,9 @@ ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
- len = ngx_http_log_escape(NULL, value->data, value->len);
|
||
|
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||
|
+
|
||
|
+ len = ngx_http_log_escape(lcf, NULL, value->data, value->len);
|
||
|
|
||
|
value->escape = len ? 1 : 0;
|
||
|
|
||
|
@@ -954,6 +967,7 @@ ngx_http_log_variable_getlen(ngx_http_request_t *r, uintptr_t data)
|
||
|
static u_char *
|
||
|
ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||
|
{
|
||
|
+ ngx_http_log_loc_conf_t *lcf;
|
||
|
ngx_http_variable_value_t *value;
|
||
|
|
||
|
value = ngx_http_get_indexed_variable(r, op->data);
|
||
|
@@ -967,16 +981,18 @@ ngx_http_log_variable(ngx_http_request_t *r, u_char *buf, ngx_http_log_op_t *op)
|
||
|
return ngx_cpymem(buf, value->data, value->len);
|
||
|
|
||
|
} else {
|
||
|
- return (u_char *) ngx_http_log_escape(buf, value->data, value->len);
|
||
|
+ lcf = ngx_http_get_module_loc_conf(r, ngx_http_log_module);
|
||
|
+ return (u_char *) ngx_http_log_escape(lcf, buf, value->data, value->len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
static uintptr_t
|
||
|
-ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||
|
+ngx_http_log_escape(ngx_http_log_loc_conf_t *lcf, u_char *dst, u_char *src,
|
||
|
+ size_t size)
|
||
|
{
|
||
|
- ngx_uint_t n;
|
||
|
- static u_char hex[] = "0123456789ABCDEF";
|
||
|
+ ngx_uint_t n;
|
||
|
+ static u_char hex[] = "0123456789ABCDEF";
|
||
|
|
||
|
static uint32_t escape[] = {
|
||
|
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||
|
@@ -996,6 +1012,12 @@ ngx_http_log_escape(u_char *dst, u_char *src, size_t size)
|
||
|
0xffffffff, /* 1111 1111 1111 1111 1111 1111 1111 1111 */
|
||
|
};
|
||
|
|
||
|
+ if (lcf->escape_non_ascii) {
|
||
|
+ ngx_memset(&escape[4], 0xff, sizeof(uint32_t) * 4);
|
||
|
+
|
||
|
+ } else {
|
||
|
+ ngx_memzero(&escape[4], sizeof(uint32_t) * 4);
|
||
|
+ }
|
||
|
|
||
|
if (dst == NULL) {
|
||
|
|
||
|
@@ -1120,6 +1142,7 @@ ngx_http_log_create_loc_conf(ngx_conf_t *cf)
|
||
|
}
|
||
|
|
||
|
conf->open_file_cache = NGX_CONF_UNSET_PTR;
|
||
|
+ conf->escape_non_ascii = NGX_CONF_UNSET;
|
||
|
|
||
|
return conf;
|
||
|
}
|
||
|
@@ -1135,6 +1158,8 @@ ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
|
||
|
ngx_http_log_fmt_t *fmt;
|
||
|
ngx_http_log_main_conf_t *lmcf;
|
||
|
|
||
|
+ ngx_conf_merge_value(conf->escape_non_ascii, prev->escape_non_ascii, 1);
|
||
|
+
|
||
|
if (conf->open_file_cache == NGX_CONF_UNSET_PTR) {
|
||
|
|
||
|
conf->open_file_cache = prev->open_file_cache;
|