blob: 4e348675ab53fca78786788099c99363c26b72b0 [file] [log] [blame] [raw]
/*
* Copyright (C) Xiaozhe Wang (chaoslawful)
* Copyright (C) Yichun Zhang (agentzh)
*/
#ifndef DDEBUG
#define DDEBUG 0
#endif
#include "ddebug.h"
#include "ngx_http_lua_directive.h"
#include "ngx_http_lua_capturefilter.h"
#include "ngx_http_lua_contentby.h"
#include "ngx_http_lua_rewriteby.h"
#include "ngx_http_lua_accessby.h"
#include "ngx_http_lua_logby.h"
#include "ngx_http_lua_util.h"
#include "ngx_http_lua_headerfilterby.h"
#include "ngx_http_lua_bodyfilterby.h"
#include "ngx_http_lua_initby.h"
#include "ngx_http_lua_probe.h"
#if !defined(nginx_version) || nginx_version < 8054
#error "at least nginx 0.8.54 is required"
#endif
static void *ngx_http_lua_create_main_conf(ngx_conf_t *cf);
static char *ngx_http_lua_init_main_conf(ngx_conf_t *cf, void *conf);
static void *ngx_http_lua_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_lua_merge_loc_conf(ngx_conf_t *cf, void *parent,
void *child);
static ngx_int_t ngx_http_lua_init(ngx_conf_t *cf);
static char *ngx_http_lua_lowat_check(ngx_conf_t *cf, void *post, void *data);
static ngx_conf_post_t ngx_http_lua_lowat_post =
{ ngx_http_lua_lowat_check };
static volatile ngx_cycle_t *ngx_http_lua_prev_cycle = NULL;
static ngx_command_t ngx_http_lua_cmds[] = {
{ ngx_string("lua_max_running_timers"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_MAIN_CONF_OFFSET,
offsetof(ngx_http_lua_main_conf_t, max_running_timers),
NULL },
{ ngx_string("lua_max_pending_timers"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_MAIN_CONF_OFFSET,
offsetof(ngx_http_lua_main_conf_t, max_pending_timers),
NULL },
{ ngx_string("lua_shared_dict"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,
ngx_http_lua_shared_dict,
0,
0,
NULL },
#if (NGX_PCRE)
{ ngx_string("lua_regex_cache_max_entries"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_MAIN_CONF_OFFSET,
offsetof(ngx_http_lua_main_conf_t, regex_cache_max_entries),
NULL },
{ ngx_string("lua_regex_match_limit"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_MAIN_CONF_OFFSET,
offsetof(ngx_http_lua_main_conf_t, regex_match_limit),
NULL },
#endif
{ ngx_string("lua_package_cpath"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_http_lua_package_cpath,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
NULL },
{ ngx_string("lua_package_path"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_http_lua_package_path,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
NULL },
{ ngx_string("lua_code_cache"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_http_lua_code_cache,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, enable_code_cache),
NULL },
{ ngx_string("lua_need_request_body"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, force_read_body),
NULL },
{ ngx_string("lua_transform_underscores_in_response_headers"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, transform_underscores_in_resp_headers),
NULL },
{ ngx_string("lua_socket_log_errors"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, log_socket_errors),
NULL },
{ ngx_string("init_by_lua"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_http_lua_init_by_lua,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
(void *) ngx_http_lua_init_by_inline },
{ ngx_string("init_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
ngx_http_lua_init_by_lua,
NGX_HTTP_MAIN_CONF_OFFSET,
0,
(void *) ngx_http_lua_init_by_file },
#if defined(NDK) && NDK
/* set_by_lua $res <inline script> [$arg1 [$arg2 [...]]] */
{ ngx_string("set_by_lua"),
NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_2MORE,
ngx_http_lua_set_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_filter_set_by_lua_inline },
/* set_by_lua_file $res rel/or/abs/path/to/script [$arg1 [$arg2 [..]]] */
{ ngx_string("set_by_lua_file"),
NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_2MORE,
ngx_http_lua_set_by_lua_file,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_filter_set_by_lua_file },
#endif
/* rewrite_by_lua <inline script> */
{ ngx_string("rewrite_by_lua"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_rewrite_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_rewrite_handler_inline },
/* access_by_lua <inline script> */
{ ngx_string("access_by_lua"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_access_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_access_handler_inline },
/* content_by_lua <inline script> */
{ ngx_string("content_by_lua"),
NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_http_lua_content_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_content_handler_inline },
/* log_by_lua <inline script> */
{ ngx_string("log_by_lua"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_log_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_log_handler_inline },
{ ngx_string("rewrite_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_rewrite_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_rewrite_handler_file },
{ ngx_string("rewrite_by_lua_no_postpone"),
NGX_HTTP_MAIN_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_MAIN_CONF_OFFSET,
offsetof(ngx_http_lua_main_conf_t, postponed_to_rewrite_phase_end),
NULL },
{ ngx_string("access_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_access_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_access_handler_file },
/* content_by_lua_file rel/or/abs/path/to/script */
{ ngx_string("content_by_lua_file"),
NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_http_lua_content_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_content_handler_file },
{ ngx_string("log_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_log_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_log_handler_file },
/* header_filter_by_lua <inline script> */
{ ngx_string("header_filter_by_lua"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_header_filter_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_header_filter_inline },
{ ngx_string("header_filter_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_header_filter_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_header_filter_file },
{ ngx_string("body_filter_by_lua"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_body_filter_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_body_filter_inline },
{ ngx_string("body_filter_by_lua_file"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_TAKE1,
ngx_http_lua_body_filter_by_lua,
NGX_HTTP_LOC_CONF_OFFSET,
0,
(void *) ngx_http_lua_body_filter_file },
{ ngx_string("lua_socket_keepalive_timeout"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_msec_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, keepalive_timeout),
NULL },
{ ngx_string("lua_socket_connect_timeout"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_msec_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, connect_timeout),
NULL },
{ ngx_string("lua_socket_send_timeout"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_msec_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, send_timeout),
NULL },
{ ngx_string("lua_socket_send_lowat"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_size_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, send_lowat),
&ngx_http_lua_lowat_post },
{ ngx_string("lua_socket_buffer_size"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_size_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, buffer_size),
NULL },
{ ngx_string("lua_socket_pool_size"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, pool_size),
NULL },
{ ngx_string("lua_socket_read_timeout"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF
|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
ngx_conf_set_msec_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, read_timeout),
NULL },
{ ngx_string("lua_http10_buffering"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, http10_buffering),
NULL },
{ ngx_string("lua_check_client_abort"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, check_client_abort),
NULL },
{ ngx_string("lua_use_default_type"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF
|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_lua_loc_conf_t, use_default_type),
NULL },
ngx_null_command
};
ngx_http_module_t ngx_http_lua_module_ctx = {
NULL, /* preconfiguration */
ngx_http_lua_init, /* postconfiguration */
ngx_http_lua_create_main_conf, /* create main configuration */
ngx_http_lua_init_main_conf, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
ngx_http_lua_create_loc_conf, /* create location configuration */
ngx_http_lua_merge_loc_conf /* merge location configuration */
};
ngx_module_t ngx_http_lua_module = {
NGX_MODULE_V1,
&ngx_http_lua_module_ctx, /* module context */
ngx_http_lua_cmds, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
static ngx_int_t
ngx_http_lua_init(ngx_conf_t *cf)
{
int multi_http_blocks;
ngx_int_t rc;
ngx_array_t *arr;
ngx_http_handler_pt *h;
ngx_http_core_main_conf_t *cmcf;
ngx_http_lua_main_conf_t *lmcf;
lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);
if (ngx_http_lua_prev_cycle != ngx_cycle) {
ngx_http_lua_prev_cycle = ngx_cycle;
multi_http_blocks = 0;
} else {
multi_http_blocks = 1;
}
if (multi_http_blocks || lmcf->requires_capture_filter) {
rc = ngx_http_lua_capture_filter_init(cf);
if (rc != NGX_OK) {
return rc;
}
}
if (lmcf->postponed_to_rewrite_phase_end == NGX_CONF_UNSET) {
lmcf->postponed_to_rewrite_phase_end = 0;
}
cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
if (lmcf->requires_rewrite) {
h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);
if (h == NULL) {
return NGX_ERROR;
}
*h = ngx_http_lua_rewrite_handler;
}
if (lmcf->requires_access) {
h = ngx_array_push(&cmcf->phases[NGX_HTTP_ACCESS_PHASE].handlers);
if (h == NULL) {
return NGX_ERROR;
}
*h = ngx_http_lua_access_handler;
}
dd("requires log: %d", (int) lmcf->requires_log);
if (lmcf->requires_log) {
arr = &cmcf->phases[NGX_HTTP_LOG_PHASE].handlers;
h = ngx_array_push(arr);
if (h == NULL) {
return NGX_ERROR;
}
if (arr->nelts > 1) {
h = arr->elts;
ngx_memmove(&h[1], h,
(arr->nelts - 1) * sizeof(ngx_http_handler_pt));
}
*h = ngx_http_lua_log_handler;
}
if (multi_http_blocks || lmcf->requires_header_filter) {
rc = ngx_http_lua_header_filter_init();
if (rc != NGX_OK) {
return rc;
}
}
if (multi_http_blocks || lmcf->requires_body_filter) {
rc = ngx_http_lua_body_filter_init();
if (rc != NGX_OK) {
return rc;
}
}
if (lmcf->lua == NULL) {
dd("initializing lua vm");
ngx_http_lua_content_length_hash =
ngx_http_lua_hash_literal("content-length");
ngx_http_lua_location_hash = ngx_http_lua_hash_literal("location");
lmcf->lua = ngx_http_lua_init_vm(NULL, cf->cycle, cf->pool, lmcf,
cf->log, NULL);
if (lmcf->lua == NULL) {
ngx_conf_log_error(NGX_LOG_ERR, cf, 0,
"failed to initialize Lua VM");
return NGX_ERROR;
}
if (!lmcf->requires_shm && lmcf->init_handler) {
if (lmcf->init_handler(cf->log, lmcf, lmcf->lua) != NGX_OK) {
/* an error happened */
return NGX_ERROR;
}
}
dd("Lua VM initialized!");
}
return NGX_OK;
}
static char *
ngx_http_lua_lowat_check(ngx_conf_t *cf, void *post, void *data)
{
#if (NGX_FREEBSD)
ssize_t *np = data;
if ((u_long) *np >= ngx_freebsd_net_inet_tcp_sendspace) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"\"fastcgi_send_lowat\" must be less than %d "
"(sysctl net.inet.tcp.sendspace)",
ngx_freebsd_net_inet_tcp_sendspace);
return NGX_CONF_ERROR;
}
#elif !(NGX_HAVE_SO_SNDLOWAT)
ssize_t *np = data;
ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
"\"fastcgi_send_lowat\" is not supported, ignored");
*np = 0;
#endif
return NGX_CONF_OK;
}
static void *
ngx_http_lua_create_main_conf(ngx_conf_t *cf)
{
ngx_http_lua_main_conf_t *lmcf;
lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_main_conf_t));
if (lmcf == NULL) {
return NULL;
}
/* set by ngx_pcalloc:
* lmcf->lua = NULL;
* lmcf->lua_path = { 0, NULL };
* lmcf->lua_cpath = { 0, NULL };
* lmcf->pending_timers = 0;
* lmcf->running_timers = 0;
* lmcf->watcher = NULL;
* lmcf->regex_cache_entries = 0;
* lmcf->shm_zones = NULL;
* lmcf->init_handler = NULL;
* lmcf->init_src = { 0, NULL };
* lmcf->shm_zones_inited = 0;
* lmcf->preload_hooks = NULL;
* lmcf->requires_header_filter = 0;
* lmcf->requires_body_filter = 0;
* lmcf->requires_capture_filter = 0;
* lmcf->requires_rewrite = 0;
* lmcf->requires_access = 0;
* lmcf->requires_log = 0;
* lmcf->requires_shm = 0;
*/
lmcf->pool = cf->pool;
lmcf->max_pending_timers = NGX_CONF_UNSET;
lmcf->max_running_timers = NGX_CONF_UNSET;
#if (NGX_PCRE)
lmcf->regex_cache_max_entries = NGX_CONF_UNSET;
lmcf->regex_match_limit = NGX_CONF_UNSET;
#endif
lmcf->postponed_to_rewrite_phase_end = NGX_CONF_UNSET;
dd("nginx Lua module main config structure initialized!");
return lmcf;
}
static char *
ngx_http_lua_init_main_conf(ngx_conf_t *cf, void *conf)
{
ngx_http_lua_main_conf_t *lmcf = conf;
#if (NGX_PCRE)
if (lmcf->regex_cache_max_entries == NGX_CONF_UNSET) {
lmcf->regex_cache_max_entries = 1024;
}
if (lmcf->regex_match_limit == NGX_CONF_UNSET) {
lmcf->regex_match_limit = 0;
}
#endif
if (lmcf->max_pending_timers == NGX_CONF_UNSET) {
lmcf->max_pending_timers = 1024;
}
if (lmcf->max_running_timers == NGX_CONF_UNSET) {
lmcf->max_running_timers = 256;
}
lmcf->cycle = cf->cycle;
return NGX_CONF_OK;
}
static void *
ngx_http_lua_create_loc_conf(ngx_conf_t *cf)
{
ngx_http_lua_loc_conf_t *conf;
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_lua_loc_conf_t));
if (conf == NULL) {
return NGX_CONF_ERROR;
}
/* set by ngx_pcalloc:
* conf->access_src = {{ 0, NULL }, NULL, NULL, NULL};
* conf->access_src_key = NULL
* conf->rewrite_src = {{ 0, NULL }, NULL, NULL, NULL};
* conf->rewrite_src_key = NULL
* conf->rewrite_handler = NULL;
*
* conf->content_src = {{ 0, NULL }, NULL, NULL, NULL};
* conf->content_src_key = NULL
* conf->content_handler = NULL;
*
* conf->log_src = {{ 0, NULL }, NULL, NULL, NULL};
* conf->log_src_key = NULL
* conf->log_handler = NULL;
*
* conf->header_filter_src = {{ 0, NULL }, NULL, NULL, NULL};
* conf->header_filter_src_key = NULL
* conf->header_filter_handler = NULL;
*
* conf->body_filter_src = {{ 0, NULL }, NULL, NULL, NULL};
* conf->body_filter_src_key = NULL
* conf->body_filter_handler = NULL;
*/
conf->force_read_body = NGX_CONF_UNSET;
conf->enable_code_cache = NGX_CONF_UNSET;
conf->http10_buffering = NGX_CONF_UNSET;
conf->check_client_abort = NGX_CONF_UNSET;
conf->use_default_type = NGX_CONF_UNSET;
conf->keepalive_timeout = NGX_CONF_UNSET_MSEC;
conf->connect_timeout = NGX_CONF_UNSET_MSEC;
conf->send_timeout = NGX_CONF_UNSET_MSEC;
conf->read_timeout = NGX_CONF_UNSET_MSEC;
conf->send_lowat = NGX_CONF_UNSET_SIZE;
conf->buffer_size = NGX_CONF_UNSET_SIZE;
conf->pool_size = NGX_CONF_UNSET_UINT;
conf->transform_underscores_in_resp_headers = NGX_CONF_UNSET;
conf->log_socket_errors = NGX_CONF_UNSET;
return conf;
}
static char *
ngx_http_lua_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{
ngx_http_lua_loc_conf_t *prev = parent;
ngx_http_lua_loc_conf_t *conf = child;
if (conf->rewrite_src.value.len == 0) {
conf->rewrite_src = prev->rewrite_src;
conf->rewrite_handler = prev->rewrite_handler;
conf->rewrite_src_key = prev->rewrite_src_key;
}
if (conf->access_src.value.len == 0) {
conf->access_src = prev->access_src;
conf->access_handler = prev->access_handler;
conf->access_src_key = prev->access_src_key;
}
if (conf->content_src.value.len == 0) {
conf->content_src = prev->content_src;
conf->content_handler = prev->content_handler;
conf->content_src_key = prev->content_src_key;
}
if (conf->log_src.value.len == 0) {
conf->log_src = prev->log_src;
conf->log_handler = prev->log_handler;
conf->log_src_key = prev->log_src_key;
}
if (conf->header_filter_src.value.len == 0) {
conf->header_filter_src = prev->header_filter_src;
conf->header_filter_handler = prev->header_filter_handler;
conf->header_filter_src_key = prev->header_filter_src_key;
}
if (conf->body_filter_src.value.len == 0) {
conf->body_filter_src = prev->body_filter_src;
conf->body_filter_handler = prev->body_filter_handler;
conf->body_filter_src_key = prev->body_filter_src_key;
}
ngx_conf_merge_value(conf->force_read_body, prev->force_read_body, 0);
ngx_conf_merge_value(conf->enable_code_cache, prev->enable_code_cache, 1);
ngx_conf_merge_value(conf->http10_buffering, prev->http10_buffering, 1);
ngx_conf_merge_value(conf->check_client_abort, prev->check_client_abort, 0);
ngx_conf_merge_value(conf->use_default_type, prev->use_default_type, 1);
ngx_conf_merge_msec_value(conf->keepalive_timeout,
prev->keepalive_timeout, 60000);
ngx_conf_merge_msec_value(conf->connect_timeout,
prev->connect_timeout, 60000);
ngx_conf_merge_msec_value(conf->send_timeout,
prev->send_timeout, 60000);
ngx_conf_merge_msec_value(conf->read_timeout,
prev->read_timeout, 60000);
ngx_conf_merge_size_value(conf->send_lowat,
prev->send_lowat, 0);
ngx_conf_merge_size_value(conf->buffer_size,
prev->buffer_size,
(size_t) ngx_pagesize);
ngx_conf_merge_uint_value(conf->pool_size, prev->pool_size, 30);
ngx_conf_merge_value(conf->transform_underscores_in_resp_headers,
prev->transform_underscores_in_resp_headers, 1);
ngx_conf_merge_value(conf->log_socket_errors, prev->log_socket_errors, 1);
return NGX_CONF_OK;
}
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */