File: //usr/share/passenger/ngx_http_passenger_module/ConfigGeneral/ManifestGeneration.h
#ifndef _PASSENGER_NGINX_MODULE_CONFIG_GENERAL_MANIFEST_GENERATION_H_
#define _PASSENGER_NGINX_MODULE_CONFIG_GENERAL_MANIFEST_GENERATION_H_
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
#include "cxx_supportlib/FileTools/PathManipCBindings.h"
#include "cxx_supportlib/JsonTools/CBindings.h"
#ifndef _PASSENGER_NGINX_MODULE_CONF_STRUCT_TYPEDEFS_H_
#define _PASSENGER_NGINX_MODULE_CONF_STRUCT_TYPEDEFS_H_
struct passenger_main_conf_s;
struct passenger_loc_conf_s;
typedef struct passenger_main_conf_s passenger_main_conf_t;
typedef struct passenger_loc_conf_s passenger_loc_conf_t;
#endif /* _PASSENGER_NGINX_MODULE_CONF_STRUCT_TYPEDEFS_H_ */
typedef struct {
ngx_conf_t *cf;
PsgJsonValue *manifest;
PsgJsonValue *global_config_container;
PsgJsonValue *default_app_config_container;
PsgJsonValue *default_loc_config_container;
PsgJsonValue *app_configs_container;
PsgJsonValue *empty_object, *empty_array;
PsgJsonValueIterator *it, *end;
PsgJsonValueIterator *it2, *end2;
PsgJsonValueIterator *it3, *end3;
PsgJsonValueIterator *it4, *end4;
} manifest_gen_ctx_t;
static PsgJsonValue *generate_config_manifest(ngx_conf_t *cf, passenger_loc_conf_t *toplevel_plcf);
static void init_config_manifest_generation(ngx_conf_t *cf, manifest_gen_ctx_t *ctx);
static void deinit_config_manifest_generation(manifest_gen_ctx_t *ctx);
static void recursively_generate_config_manifest_for_loc_conf(manifest_gen_ctx_t *ctx,
passenger_loc_conf_t *plcf);
static int infer_loc_conf_app_group_name(manifest_gen_ctx_t *ctx,
passenger_loc_conf_t *plcf, ngx_http_core_loc_conf_t *clcf, ngx_str_t *result);
static u_char *infer_default_app_root(manifest_gen_ctx_t *ctx,
ngx_http_core_loc_conf_t *clcf, size_t *len);
static void generate_config_manifest_for_loc_conf(manifest_gen_ctx_t *ctx,
passenger_loc_conf_t *plcf, ngx_http_core_srv_conf_t *cscf,
ngx_http_core_loc_conf_t *clcf);
static void find_or_create_manifest_app_and_loc_options_containers(manifest_gen_ctx_t *ctx,
passenger_loc_conf_t *plcf, ngx_http_core_srv_conf_t *cscf,
ngx_http_core_loc_conf_t *clcf, PsgJsonValue **app_options_container,
PsgJsonValue **loc_options_container);
static PsgJsonValue *find_manifest_loc_config_container(manifest_gen_ctx_t *ctx,
PsgJsonValue *loc_configs_container, ngx_http_core_srv_conf_t *cscf,
ngx_http_core_loc_conf_t *clcf);
static PsgJsonValue *create_manifest_loc_config_container(manifest_gen_ctx_t *ctx,
PsgJsonValue *loc_configs_container, ngx_http_core_srv_conf_t *cscf,
ngx_http_core_loc_conf_t *clcf);
static void init_manifest_option_container(manifest_gen_ctx_t *ctx, PsgJsonValue *doc);
static PsgJsonValue *find_or_create_manifest_option_container(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name,
size_t option_name_len);
static PsgJsonValue *add_manifest_option_container_hierarchy_member(
PsgJsonValue *option_container, ngx_str_t *source_file, ngx_uint_t source_line);
static void generate_config_manifest_for_autogenerated_main_conf(manifest_gen_ctx_t *ctx,
passenger_main_conf_t *conf);
static void generate_config_manifest_for_autogenerated_loc_conf(manifest_gen_ctx_t *ctx,
passenger_loc_conf_t *plcf, ngx_http_core_srv_conf_t *cscf,
ngx_http_core_loc_conf_t *clcf);
static void reverse_manifest_value_hierarchies(manifest_gen_ctx_t *ctx);
static void reverse_value_hierarchies_in_options_container(PsgJsonValue *options_container,
PsgJsonValueIterator *it, PsgJsonValueIterator *end);
static void add_manifest_options_container_dynamic_default(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name, size_t option_name_len,
const char *desc, size_t desc_len);
static void add_manifest_options_container_static_default_str(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name, size_t option_name_len,
const char *value, size_t value_len);
static void add_manifest_options_container_static_default_int(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name, size_t option_name_len,
int value);
static void add_manifest_options_container_static_default_uint(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name, size_t option_name_len,
unsigned int value);
static void add_manifest_options_container_static_default_bool(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name, size_t option_name_len,
int value);
static void add_manifest_options_container_inferred_default_str(manifest_gen_ctx_t *ctx,
PsgJsonValue *options_container, const char *option_name, size_t option_name_len,
const char *value, size_t value_len);
static void manifest_inherit_application_value_hierarchies(manifest_gen_ctx_t *ctx);
static void manifest_inherit_location_value_hierarchies(manifest_gen_ctx_t *ctx);
static void maybe_inherit_string_array_hierarchy_values(PsgJsonValue *value_hierarchy_doc,
PsgJsonValueIterator *it, PsgJsonValueIterator *end);
static void maybe_inherit_string_keyval_hierarchy_values(PsgJsonValue *value_hierarchy_doc,
PsgJsonValueIterator *it, PsgJsonValueIterator *end);
static void psg_json_value_append_vals(PsgJsonValue *doc, PsgJsonValue *doc2,
PsgJsonValueIterator *it, PsgJsonValueIterator *end);
static int json_array_contains(PsgJsonValue *doc, PsgJsonValue *elem);
#endif /* _PASSENGER_NGINX_MODULE_CONFIG_GENERAL_MANIFEST_GENERATION_H_ */