summaryrefslogtreecommitdiff
path: root/array-var-nginx-module-0.06/src/ngx_http_array_var_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'array-var-nginx-module-0.06/src/ngx_http_array_var_util.c')
-rw-r--r--array-var-nginx-module-0.06/src/ngx_http_array_var_util.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/array-var-nginx-module-0.06/src/ngx_http_array_var_util.c b/array-var-nginx-module-0.06/src/ngx_http_array_var_util.c
new file mode 100644
index 0000000..28195e0
--- /dev/null
+++ b/array-var-nginx-module-0.06/src/ngx_http_array_var_util.c
@@ -0,0 +1,118 @@
+
+/*
+ * Copyright (C) Yichun Zhang (agentzh)
+ */
+
+
+#ifndef DDEBUG
+#define DDEBUG 0
+#endif
+#include "ddebug.h"
+
+
+#include "ngx_http_array_var_util.h"
+
+
+static ngx_int_t ngx_http_array_var_variable_not_found(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
+
+
+/* Modified from the ngx_strlcasestrn function in ngx_string.h
+ * Copyright (C) by Igor Sysoev */
+u_char *
+ngx_http_array_var_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)
+{
+ ngx_uint_t c1, c2;
+
+ c2 = (ngx_uint_t) *s2++;
+ last -= n;
+
+ do {
+ do {
+ if (s1 >= last) {
+ return NULL;
+ }
+
+ c1 = (ngx_uint_t) *s1++;
+
+ } while (c1 != c2);
+
+ } while (ngx_strncmp(s1, s2, n) != 0);
+
+ return --s1;
+}
+
+
+ndk_set_var_value_pt
+ngx_http_array_var_get_func_from_cmd(u_char *name, size_t name_len)
+{
+ ndk_set_var_t *filter;
+ ngx_uint_t i;
+ ngx_module_t **modules;
+ ngx_module_t *module;
+ ngx_command_t *cmd;
+
+#if defined(nginx_version) && nginx_version >= 1009011
+ modules = ngx_cycle->modules;
+#else
+ modules = ngx_modules;
+#endif
+
+ for (i = 0; modules[i]; i++) {
+ module = modules[i];
+ if (module->type != NGX_HTTP_MODULE) {
+ continue;
+ }
+
+ cmd = modules[i]->commands;
+ if (cmd == NULL) {
+ continue;
+ }
+
+ for ( /* void */ ; cmd->name.len; cmd++) {
+ if (cmd->set != ndk_set_var_value) {
+ continue;
+ }
+
+ filter = cmd->post;
+ if (filter == NULL) {
+ continue;
+ }
+
+ if (cmd->name.len != name_len
+ || ngx_strncmp(cmd->name.data, name, name_len) != 0)
+ {
+ continue;
+ }
+
+ return (ndk_set_var_value_pt) filter->func;
+ }
+ }
+
+ return NULL;
+}
+
+
+ngx_int_t
+ngx_http_array_var_add_variable(ngx_conf_t *cf, ngx_str_t *name)
+{
+ ngx_http_variable_t *v;
+
+ v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);
+ if (v == NULL) {
+ return NGX_ERROR;
+ }
+
+ v->get_handler = ngx_http_array_var_variable_not_found;
+
+ return ngx_http_get_variable_index(cf, name);
+}
+
+
+static ngx_int_t
+ngx_http_array_var_variable_not_found(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+ v->not_found = 1;
+ return NGX_OK;
+}