mirror of
				https://github.com/openresty/openresty.git
				synced 2024-10-13 00:29:41 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			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;
 |