src/stream/ngx_stream_set_module.c - nginx source code

Global variables defined

Data types defined

Functions defined

Source code


  1. /*
  2. * Copyright (C) Pavel Pautov
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>
  7. #include <ngx_stream.h>


  8. typedef struct {
  9.     ngx_int_t                   index;
  10.     ngx_stream_set_variable_pt  set_handler;
  11.     uintptr_t                   data;
  12.     ngx_stream_complex_value_t  value;
  13. } ngx_stream_set_cmd_t;


  14. typedef struct {
  15.     ngx_array_t                 commands;
  16. } ngx_stream_set_srv_conf_t;


  17. static ngx_int_t ngx_stream_set_handler(ngx_stream_session_t *s);
  18. static ngx_int_t ngx_stream_set_var(ngx_stream_session_t *s,
  19.     ngx_stream_variable_value_t *v, uintptr_t data);
  20. static ngx_int_t ngx_stream_set_init(ngx_conf_t *cf);
  21. static void *ngx_stream_set_create_srv_conf(ngx_conf_t *cf);
  22. static char *ngx_stream_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);


  23. static ngx_command_t  ngx_stream_set_commands[] = {

  24.     { ngx_string("set"),
  25.       NGX_STREAM_SRV_CONF|NGX_CONF_TAKE2,
  26.       ngx_stream_set,
  27.       NGX_STREAM_SRV_CONF_OFFSET,
  28.       0,
  29.       NULL },

  30.       ngx_null_command
  31. };


  32. static ngx_stream_module_t  ngx_stream_set_module_ctx = {
  33.     NULL,                                  /* preconfiguration */
  34.     ngx_stream_set_init,                   /* postconfiguration */

  35.     NULL,                                  /* create main configuration */
  36.     NULL,                                  /* init main configuration */

  37.     ngx_stream_set_create_srv_conf,        /* create server configuration */
  38.     NULL                                   /* merge server configuration */
  39. };


  40. ngx_module_t  ngx_stream_set_module = {
  41.     NGX_MODULE_V1,
  42.     &ngx_stream_set_module_ctx,            /* module context */
  43.     ngx_stream_set_commands,               /* module directives */
  44.     NGX_STREAM_MODULE,                     /* module type */
  45.     NULL,                                  /* init master */
  46.     NULL,                                  /* init module */
  47.     NULL,                                  /* init process */
  48.     NULL,                                  /* init thread */
  49.     NULL,                                  /* exit thread */
  50.     NULL,                                  /* exit process */
  51.     NULL,                                  /* exit master */
  52.     NGX_MODULE_V1_PADDING
  53. };


  54. static ngx_int_t
  55. ngx_stream_set_handler(ngx_stream_session_t *s)
  56. {
  57.     ngx_str_t                     str;
  58.     ngx_uint_t                    i;
  59.     ngx_stream_set_cmd_t         *cmds;
  60.     ngx_stream_set_srv_conf_t    *scf;
  61.     ngx_stream_variable_value_t   vv;

  62.     scf = ngx_stream_get_module_srv_conf(s, ngx_stream_set_module);
  63.     cmds = scf->commands.elts;
  64.     vv = ngx_stream_variable_null_value;

  65.     for (i = 0; i < scf->commands.nelts; i++) {
  66.         if (ngx_stream_complex_value(s, &cmds[i].value, &str) != NGX_OK) {
  67.             return NGX_ERROR;
  68.         }

  69.         if (cmds[i].set_handler != NULL) {
  70.             vv.len = str.len;
  71.             vv.data = str.data;
  72.             cmds[i].set_handler(s, &vv, cmds[i].data);

  73.         } else {
  74.             s->variables[cmds[i].index].len = str.len;
  75.             s->variables[cmds[i].index].valid = 1;
  76.             s->variables[cmds[i].index].no_cacheable = 0;
  77.             s->variables[cmds[i].index].not_found = 0;
  78.             s->variables[cmds[i].index].data = str.data;
  79.         }
  80.     }

  81.     return NGX_DECLINED;
  82. }


  83. static ngx_int_t
  84. ngx_stream_set_var(ngx_stream_session_t *s, ngx_stream_variable_value_t *v,
  85.     uintptr_t data)
  86. {
  87.     *v = ngx_stream_variable_null_value;

  88.     return NGX_OK;
  89. }


  90. static ngx_int_t
  91. ngx_stream_set_init(ngx_conf_t *cf)
  92. {
  93.     ngx_stream_handler_pt        *h;
  94.     ngx_stream_core_main_conf_t  *cmcf;

  95.     cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);

  96.     h = ngx_array_push(&cmcf->phases[NGX_STREAM_PREACCESS_PHASE].handlers);
  97.     if (h == NULL) {
  98.         return NGX_ERROR;
  99.     }

  100.     *h = ngx_stream_set_handler;

  101.     return NGX_OK;
  102. }


  103. static void *
  104. ngx_stream_set_create_srv_conf(ngx_conf_t *cf)
  105. {
  106.     ngx_stream_set_srv_conf_t  *conf;

  107.     conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_set_srv_conf_t));
  108.     if (conf == NULL) {
  109.         return NULL;
  110.     }

  111.     /*
  112.      * set by ngx_pcalloc():
  113.      *
  114.      *     conf->commands = { NULL };
  115.      */

  116.     return conf;
  117. }


  118. static char *
  119. ngx_stream_set(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
  120. {
  121.     ngx_stream_set_srv_conf_t  *scf = conf;

  122.     ngx_str_t                           *args;
  123.     ngx_int_t                            index;
  124.     ngx_stream_set_cmd_t                *set_cmd;
  125.     ngx_stream_variable_t               *v;
  126.     ngx_stream_compile_complex_value_t   ccv;

  127.     args = cf->args->elts;

  128.     if (args[1].data[0] != '$') {
  129.         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
  130.                            "invalid variable name \"%V\"", &args[1]);
  131.         return NGX_CONF_ERROR;
  132.     }

  133.     args[1].len--;
  134.     args[1].data++;

  135.     v = ngx_stream_add_variable(cf, &args[1],
  136.                                 NGX_STREAM_VAR_CHANGEABLE|NGX_STREAM_VAR_WEAK);
  137.     if (v == NULL) {
  138.         return NGX_CONF_ERROR;
  139.     }

  140.     index = ngx_stream_get_variable_index(cf, &args[1]);
  141.     if (index == NGX_ERROR) {
  142.         return NGX_CONF_ERROR;
  143.     }

  144.     if (v->get_handler == NULL) {
  145.         v->get_handler = ngx_stream_set_var;
  146.     }

  147.     if (scf->commands.elts == NULL) {
  148.         if (ngx_array_init(&scf->commands, cf->pool, 1,
  149.                            sizeof(ngx_stream_set_cmd_t))
  150.             != NGX_OK)
  151.         {
  152.             return NGX_CONF_ERROR;
  153.         }
  154.     }

  155.     set_cmd = ngx_array_push(&scf->commands);
  156.     if (set_cmd == NULL) {
  157.         return NGX_CONF_ERROR;
  158.     }

  159.     set_cmd->index = index;
  160.     set_cmd->set_handler = v->set_handler;
  161.     set_cmd->data = v->data;

  162.     ngx_memzero(&ccv, sizeof(ngx_stream_compile_complex_value_t));

  163.     ccv.cf = cf;
  164.     ccv.value = &args[2];
  165.     ccv.complex_value = &set_cmd->value;

  166.     if (ngx_stream_compile_complex_value(&ccv) != NGX_OK) {
  167.         return NGX_CONF_ERROR;
  168.     }

  169.     return NGX_CONF_OK;
  170. }