Accessing the location configuration of module 2 during post configuration processing of module 1 for a particular server

Rv Rv rvrv7575 at yahoo.com
Mon Jun 16 06:58:50 UTC 2014


Hello Maxim
Thanks for the response.
>>As previously suggested, you should consider using merge callbacks>>to validate configuration instead.

The requirement is *not* to validate the configuration. The requirement is to find the final value set by one of the directives once the configuration has been parsed. e..g lets say we have a directive my_set_flag that sets a value to 0 or 1.

So if in configuration we have 
location \ {
my_set_flag 0;
---
my_set_flag 1;
---
my_set_flag 0;
}

then the merge callback will be called thrice for each invocation of the directive. Let's assume the logic is to set a variable with whatever the value of the directive was. So once parsing completes, the value of the variable should be 0.

I can get this value during request processing. However, I cannot get this value *after* the parsing of the configuration has completed.  What is the nginx recommended way to get this value. As noted in earlier post, I am not seeing the correct values in post configuration - and so perhaps that is not the right way.

Thanks for your continued inputs


Hello!

On Thu, Jun 12, 2014 at 01:46:58PM +0800, Rv Rv wrote:

[...]

> In the post configuration, I see that flag is not properly set
> but somestring is. Flag is properly set during request
> processing though.
> Are the values set during processing of a directive in location
> struct guaranteed to be set by the time post configuration is
> executed?
> When is the time that one can check for the values set during
> configuration. I need to test these values to ensure that they
> are sane when nginx is executed with -t option

Again: there are lots of location configurations, and by trying to
access them at postconfiguration callback you are likely checking
a wrong one. Note that even a simple config with a single
location in a single server{} block, like this:

http { server { location { ... } } }

has 3 location configurations for each http module.

As previously suggested, you should consider using merge callbacks
to validate configuration instead.

--
Maxim Dounin
http://nginx.org/



On Thursday, 12 June 2014 11:16 AM, Rv Rv <rvrv7575 at yahoo.com> wrote:
 


Hello Maxim
Thanks for your response. Here is a related query.
Say in module 1 I have a
 typedef struct  {
int flag;
ngx_str somestring;
} module1;

flag gets initialized with the following code 


    { ngx_string("module1_directive"),
      NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(module1,configured),
      NULL },

somestring gets iniitialized with a handler written in the module (i.e  not ngx_conf_set_flag_slot or any inbuilt handler).

In the post configuration, I see that flag is not properly set but somestring is. Flag is properly set during request processing though.
Are the values set during processing of a directive in location struct guaranteed to be set by the time post configuration is executed?
When is the time that one can check for the values set during configuration. I need to test these values to ensure that they are sane when nginx is executed with -t option

Thanks

Hello!

On Tue, Jun 10, 2014 at 02:09:13AM +0800, Rv Rv wrote:

> How do we access the configuration of a an unrelated module in a 
> given module. This may be required for example to check if the 
> directives pertaining to module 2 were specified in location for 
> a particular server that has directives for module 1 in its 
> configuration.

I don't think it's something you should do at postconfiguration - 
location structure is complex and not easily accessible.  There 
are location configuration merge callbacks where you are expected 
to work with location configs and, in particular, can use 
ngx_http_conf_get_module_loc_conf() macro to access a 
configuration of other modules (note though, that order of modules 
may be important in this case).

[...]

> I did not find any documentation on how the configuration is stored within nginx using these structs?

It's under src/, in C language.

I would rather say it's not a part of the API, and you'd better 
avoid using it directly.

-- 
Maxim Dounin
http://nginx.org/



------------------------------



On Monday, 9 June 2014 11:39 PM, Rv Rv <rvrv7575 at yahoo.com> wrote:
 


How do we access the configuration of a an unrelated module in a given module. This may be required for example to check if the directives pertaining to module 2 were specified in location for a particular server that has directives for module 1 in its configuration.

From what I understand, code similar to this can be used 
/* Get http main configuration */
    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index]; 

/* Get the list of servers */
    cscfp = cmcf->servers.elts;
/* Iterate through the list */
    for (s = 0; s < cmcf->servers.nelts; s++) {
  /* Problem : how to get the configuration of module 2*/
                  cscfp[s]->ctx->loc_conf[module2.ctx_index];-------------> does not yield the correct location struct of module 2

I did not find any documentation on how the configuration is stored within nginx using these structs 
typedef struct {
.............
 /* server ctx */ ngx_http_conf_ctx_t        *ctx; ............

} ngx_http_core_srv_conf_t;


typedef struct {
    void        **main_conf;
    void        **srv_conf;
    void        **loc_conf;
} ngx_http_conf_ctx_t;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx/attachments/20140616/a60c699e/attachment-0001.html>


More information about the nginx mailing list