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;