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 D.
http://nginx.org/
On Thursday, 12 June 2014 11:16 AM, Rv Rv [email protected] 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 D.
http://nginx.org/
On Monday, 9 June 2014 11:39 PM, Rv Rv [email protected] 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;