[PATCH] export variables from the log module
Vladimir Shebordaev
vshebordaev at mail.ru
Sun Sep 30 03:55:49 UTC 2012
Index: src/http/ngx_http_variables.c
===================================================================
--- src/http/ngx_http_variables.c (revision 4872)
+++ src/http/ngx_http_variables.c (working copy)
@@ -487,12 +487,14 @@
} else {
vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t));
-
- if (vv && v->get_handler(r, vv, v->data) == NGX_OK) {
- return vv;
+ if (vv) {
+
+ vv->len = 0;
+ if (v->get_handler(r, vv, v->data) != NGX_OK) {
+ vv = NULL;
+ }
}
-
- return NULL;
+ return vv;
}
}
Index: src/http/modules/ngx_http_log_module.c
===================================================================
--- src/http/modules/ngx_http_log_module.c (revision 4872)
+++ src/http/modules/ngx_http_log_module.c (working copy)
@@ -114,6 +114,7 @@
static void *ngx_http_log_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_log_merge_loc_conf(ngx_conf_t *cf, void *parent,
void *child);
+static ngx_int_t ngx_http_log_add_variables(ngx_conf_t *cf);
static char *ngx_http_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
static char *ngx_http_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -154,7 +155,7 @@
static ngx_http_module_t ngx_http_log_module_ctx = {
- NULL, /* preconfiguration */
+ ngx_http_log_add_variables, /* preconfiguration */
ngx_http_log_init, /* postconfiguration */
ngx_http_log_create_main_conf, /* create main configuration */
@@ -1338,6 +1339,70 @@
static ngx_int_t
+ngx_http_log_get_variable(ngx_http_request_t *r, ngx_variable_value_t *value, uintptr_t data)
+{
+ ngx_http_log_var_t *v;
+
+ v = (ngx_http_log_var_t *)data;
+
+ if (!value->len) {
+ value->data = ngx_pnalloc(r->pool, v->len);
+ if (value->data == NULL) {
+ return NGX_ERROR;
+ }
+ }
+
+ value->len = v->run(r, value->data, NULL) - value->data;
+
+ value->not_found = 0;
+ value->valid = 1;
+
+ return NGX_OK;
+}
+
+
+static ngx_int_t
+ngx_http_log_add_variables(ngx_conf_t *cf)
+{
+ ngx_http_log_var_t *v;
+ ngx_http_variable_t *var;
+ ngx_http_core_main_conf_t *cmcf;
+
+ ngx_int_t rc;
+
+ cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
+
+ var = NULL;
+
+ for (v = ngx_http_log_vars; v->name.len; v++) {
+
+ if (var == NULL) {
+ var = ngx_pcalloc(cf->pool, sizeof(ngx_http_variable_t));
+ if (var == NULL) {
+ return NGX_ERROR;
+ }
+ }
+
+ var->name = v->name;
+
+ rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, var,
+ NGX_HASH_READONLY_KEY);
+
+ if (rc == NGX_BUSY) {
+ continue;
+ }
+
+ var->get_handler = ngx_http_log_get_variable;
+ var->data = (uintptr_t)v;
+ var->flags = NGX_HTTP_VAR_CHANGEABLE|NGX_HTTP_VAR_NOCACHEABLE;
+
+ var = NULL;
+ }
+
+ return NGX_OK;
+}
+
+static ngx_int_t
ngx_http_log_init(ngx_conf_t *cf)
{
ngx_str_t *value;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20120930/577dcb33/attachment.html>
More information about the nginx-devel
mailing list