Skip to content

Commit

Permalink
feature: implemented a configure_by_lua phase.
Browse files Browse the repository at this point in the history
  • Loading branch information
thibaultcha committed Feb 16, 2018
1 parent a698cb0 commit 69f7817
Show file tree
Hide file tree
Showing 11 changed files with 733 additions and 57 deletions.
2 changes: 2 additions & 0 deletions config
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,7 @@ HTTP_LUA_SRCS=" \
$ngx_addon_dir/src/ngx_http_lua_semaphore.c\
$ngx_addon_dir/src/ngx_http_lua_coroutine.c \
$ngx_addon_dir/src/ngx_http_lua_bodyfilterby.c \
$ngx_addon_dir/src/ngx_http_lua_configureby.c \
$ngx_addon_dir/src/ngx_http_lua_initby.c \
$ngx_addon_dir/src/ngx_http_lua_initworkerby.c \
$ngx_addon_dir/src/ngx_http_lua_socket_udp.c \
Expand Down Expand Up @@ -405,6 +406,7 @@ HTTP_LUA_DEPS=" \
$ngx_addon_dir/src/ngx_http_lua_semaphore.h\
$ngx_addon_dir/src/ngx_http_lua_coroutine.h \
$ngx_addon_dir/src/ngx_http_lua_bodyfilterby.h \
$ngx_addon_dir/src/ngx_http_lua_configureby.h \
$ngx_addon_dir/src/ngx_http_lua_initby.h \
$ngx_addon_dir/src/ngx_http_lua_initworkerby.h \
$ngx_addon_dir/src/ngx_http_lua_socket_udp.h \
Expand Down
5 changes: 5 additions & 0 deletions src/ngx_http_lua_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ typedef struct ngx_http_lua_balancer_peer_data_s
typedef struct ngx_http_lua_sema_mm_s ngx_http_lua_sema_mm_t;


typedef ngx_int_t (*ngx_http_lua_configure_handler_pt)(ngx_conf_t *cf,
ngx_http_lua_main_conf_t *lmcf);
typedef ngx_int_t (*ngx_http_lua_main_conf_handler_pt)(ngx_log_t *log,
ngx_http_lua_main_conf_t *lmcf, lua_State *L);
typedef ngx_int_t (*ngx_http_lua_srv_conf_handler_pt)(ngx_http_request_t *r,
Expand Down Expand Up @@ -198,6 +200,9 @@ struct ngx_http_lua_main_conf_s {
ngx_flag_t postponed_to_rewrite_phase_end;
ngx_flag_t postponed_to_access_phase_end;

ngx_http_lua_configure_handler_pt configure_handler;
ngx_str_t configure_src;

ngx_http_lua_main_conf_handler_pt init_handler;
ngx_str_t init_src;

Expand Down
287 changes: 287 additions & 0 deletions src/ngx_http_lua_configureby.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,287 @@

/*
* Copyright (C) Yichun Zhang (agentzh)
*
* Author: Thibault Charbonnier (thibaultcha)
* I hereby assign copyright in this code to the lua-nginx-module project,
* to be licensed under the same terms as the rest of the code.
*/


#ifndef DDEBUG
#define DDEBUG 0
#endif


#include "ddebug.h"
#include "ngx_http_lua_configureby.h"
#include "ngx_http_lua_directive.h"
#include "ngx_http_lua_util.h"
#include "ngx_http_lua_shdict.h"
#include "ngx_http_lua_api.h"


static ngx_conf_t *cfp;


char *
ngx_http_lua_configure_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf)
{
char *rv;
ngx_conf_t save;

save = *cf;
cf->handler = ngx_http_lua_configure_by_lua;
cf->handler_conf = conf;

rv = ngx_http_lua_conf_lua_block_parse(cf, cmd);

*cf = save;

return rv;
}


char *
ngx_http_lua_configure_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf)
{
u_char *name;
ngx_str_t *value;
ngx_http_lua_main_conf_t *lmcf = conf;

if (cmd->post == NULL) {
return NGX_CONF_ERROR;
}

if (lmcf->configure_handler) {
return "is duplicate";
}

value = cf->args->elts;

if (value[1].len == 0) {
ngx_conf_log_error(NGX_LOG_ERR, cf, 0,
"invalid location config: no runnable Lua code");
return NGX_CONF_ERROR;
}

lmcf->configure_handler = (ngx_http_lua_configure_handler_pt) cmd->post;

if (cmd->post == ngx_http_lua_configure_handler_file) {
name = ngx_http_lua_rebase_path(cf->pool, value[1].data,
value[1].len);
if (name == NULL) {
return NGX_CONF_ERROR;
}

lmcf->configure_src.data = name;
lmcf->configure_src.len = ngx_strlen(name);

} else {
lmcf->configure_src = value[1];
}

return NGX_CONF_OK;
}


ngx_int_t
ngx_http_lua_configure_handler_inline(ngx_conf_t *cf,
ngx_http_lua_main_conf_t *lmcf)
{
int status;
lua_State *L = lmcf->lua;

cfp = cf;

status = luaL_loadbuffer(L, (char *) lmcf->configure_src.data,
lmcf->configure_src.len, "=configure_by_lua")
|| ngx_http_lua_do_call(cf->log, L);

cfp = NULL;

return ngx_http_lua_report(cf->log, L, status, "configure_by_lua");
}


ngx_int_t
ngx_http_lua_configure_handler_file(ngx_conf_t *cf,
ngx_http_lua_main_conf_t *lmcf)
{
int status;
lua_State *L = lmcf->lua;

cfp = cf;

status = luaL_loadfile(L, (char *) lmcf->configure_src.data)
|| ngx_http_lua_do_call(cf->log, L);

cfp = NULL;

return ngx_http_lua_report(cf->log, L, status, "configure_by_lua_file");
}


ngx_uint_t
ngx_http_lua_is_configure_phase()
{
return cfp != NULL;
}


#ifndef NGX_LUA_NO_FFI_API
unsigned int
ngx_http_lua_ffi_is_configure_phase()
{
return ngx_http_lua_is_configure_phase();
}


int
ngx_http_lua_ffi_configure_shared_dict(ngx_str_t *name, ngx_str_t *size,
u_char *errstr, size_t *err_len)
{
ssize_t ssize;
ngx_shm_zone_t **zp;
ngx_shm_zone_t *zone;
ngx_http_lua_shdict_ctx_t *ctx;
ngx_http_lua_main_conf_t *lmcf;
lua_State *L;
ngx_conf_t *cf = cfp;

lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);

ssize = ngx_parse_size(size);
if (ssize <= NGX_HTTP_LUA_SHDICT_MINSIZE) {
*err_len = ngx_snprintf(errstr, *err_len,
"invalid lua shared dict size \"%s\"",
size->data)
- errstr;
return NGX_ERROR;
}

ctx = ngx_pcalloc(cf->cycle->pool, sizeof(ngx_http_lua_shdict_ctx_t));
if (ctx == NULL) {
*err_len = ngx_snprintf(errstr, *err_len, "no memory")
- errstr;
return NGX_ERROR;
}

ctx->name = *name;
ctx->main_conf = lmcf;
ctx->log = &cf->cycle->new_log;

zone = ngx_http_lua_shared_memory_add(cf, name, (size_t) ssize,
&ngx_http_lua_module);
if (zone == NULL) {
*err_len = ngx_snprintf(errstr, *err_len, "no memory")
- errstr;
return NGX_ERROR;
}

if (zone->data) {
return NGX_DECLINED;
}

zone->init = ngx_http_lua_shdict_init_zone;
zone->data = ctx;

if (lmcf->shdict_zones == NULL) {
lmcf->shdict_zones = ngx_palloc(cf->pool, sizeof(ngx_array_t));
if (lmcf->shdict_zones == NULL) {
*err_len = ngx_snprintf(errstr, *err_len, "no memory")
- errstr;
return NGX_ERROR;
}

if (ngx_array_init(lmcf->shdict_zones, cf->pool, 2,
sizeof(ngx_shm_zone_t *))
!= NGX_OK)
{
*err_len = ngx_snprintf(errstr, *err_len, "no memory")
- errstr;
return NGX_ERROR;
}
}

zp = ngx_array_push(lmcf->shdict_zones);
if (zp == NULL) {
*err_len = ngx_snprintf(errstr, *err_len, "no memory")
- errstr;
return NGX_ERROR;
}

*zp = zone;

L = lmcf->lua;

lua_getglobal(L, "ngx");
lua_getfield(L, -1, "shared");
if (!lua_getmetatable(L, -1)) {
ngx_http_lua_create_shdict_mt(L); /* ngx.shared shmt */
}

ngx_http_lua_attach_shdict(L, name, zone);
lua_pop(L, 2); /* pop: ngx.shared + shmt */

return NGX_OK;
}


void
ngx_http_lua_ffi_configure_max_pending_timers(int n_timers)
{

ngx_http_lua_main_conf_t *lmcf;
ngx_conf_t *cf = cfp;

lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);

lmcf->max_pending_timers = (ngx_int_t) n_timers;
}


void
ngx_http_lua_ffi_configure_max_running_timers(int n_timers)
{

ngx_http_lua_main_conf_t *lmcf;
ngx_conf_t *cf = cfp;

lmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_lua_module);

lmcf->max_running_timers = (ngx_int_t) n_timers;
}


int
ngx_http_lua_ffi_configure_env(u_char *value, size_t name_len, size_t len)
{
ngx_core_conf_t *ccf;
ngx_str_t *var;
ngx_conf_t *cf = cfp;

ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,
ngx_core_module);

var = ngx_array_push(&ccf->env);
if (var == NULL) {
return NGX_ERROR;
}

var->data = ngx_pnalloc(cf->pool, len);
if (var->data == NULL) {
return NGX_ERROR;
}

(void) ngx_copy(var->data, value, len);
var->len = name_len;

return NGX_OK;
}
#endif


/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
35 changes: 35 additions & 0 deletions src/ngx_http_lua_configureby.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@

/*
* Copyright (C) Yichun Zhang (agentzh)
*
* Author: Thibault Charbonnier (thibaultcha)
* I hereby assign copyright in this code to the lua-nginx-module project,
* to be licensed under the same terms as the rest of the code.
*/


#ifndef _NGX_HTTP_LUA_CONFIGUREBY_H_INCLUDED_
#define _NGX_HTTP_LUA_CONFIGUREBY_H_INCLUDED_


#include "ngx_http_lua_common.h"


char *ngx_http_lua_configure_by_lua_block(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);

char *ngx_http_lua_configure_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);

ngx_int_t ngx_http_lua_configure_handler_inline(ngx_conf_t *cf,
ngx_http_lua_main_conf_t *lmcf);

ngx_int_t ngx_http_lua_configure_handler_file(ngx_conf_t *cf,
ngx_http_lua_main_conf_t *lmcf);

ngx_uint_t ngx_http_lua_is_configure_phase();


#endif /* _NGX_HTTP_LUA_CONFIGUREBY_H_INCLUDED_ */

/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
2 changes: 1 addition & 1 deletion src/ngx_http_lua_directive.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ ngx_http_lua_shared_dict(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

size = ngx_parse_size(&value[2]);

if (size <= 8191) {
if (size <= NGX_HTTP_LUA_SHDICT_MINSIZE) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
"invalid lua shared dict size \"%V\"", &value[2]);
return NGX_CONF_ERROR;
Expand Down
Loading

0 comments on commit 69f7817

Please sign in to comment.