ngx_int_t ngx_http_lua_log_handler_file(ngx_http_request_t *r) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_loc_conf_t *llcf; ngx_str_t eval_src; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); if (ngx_http_complex_value(r, &llcf->log_src, &eval_src) != NGX_OK) { return NGX_ERROR; } script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data, eval_src.len); if (script_path == NULL) { return NGX_ERROR; } L = ngx_http_lua_get_lua_vm(r, NULL); /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(r, L, script_path, llcf->log_src_key); if (rc != NGX_OK) { return NGX_ERROR; } return ngx_http_lua_log_by_chunk(L, r); }
ngx_int_t ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v, void *data) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; ngx_http_lua_loc_conf_t *llcf; char *err; size_t nargs; ngx_http_lua_set_var_data_t *filter_data = data; dd("set by lua file"); filter_data->script.data = v[0].data; filter_data->script.len = v[0].len; /* skip the lua file path argument */ v++; nargs = filter_data->size - 1; dd("script: %.*s", (int) filter_data->script.len, filter_data->script.data); dd("nargs: %d", (int) nargs); script_path = ngx_http_lua_rebase_path(r->pool, filter_data->script.data, filter_data->script.len); if (script_path == NULL) { return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, script_path, filter_data->key, &err, llcf->enable_code_cache ? 1 : 0); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "failed to load Lua file: %s", err); return NGX_ERROR; } rc = ngx_http_lua_set_by_chunk(L, r, val, v, nargs, &filter_data->script); if (rc != NGX_OK) { return NGX_ERROR; } return NGX_OK; }
ngx_int_t ngx_http_lua_header_filter_file(ngx_http_request_t *r) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; ngx_http_lua_loc_conf_t *llcf; char *err; ngx_str_t eval_src; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); /* Eval nginx variables in code path string first */ if (ngx_http_complex_value(r, &llcf->header_filter_src, &eval_src) != NGX_OK) { return NGX_ERROR; } script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data, eval_src.len); if (script_path == NULL) { return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, script_path, llcf->header_filter_src_key, &err, llcf->enable_code_cache ? 1 : 0); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "failed to load Lua inlined code: %s", err); return NGX_HTTP_INTERNAL_SERVER_ERROR; } /* make sure we have a valid code chunk */ assert(lua_isfunction(L, -1)); rc = ngx_http_lua_header_filter_by_chunk(L, r); if (rc != NGX_OK) { return NGX_ERROR; } return NGX_OK; }
ngx_int_t ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v, void *data) { lua_State *L; ngx_int_t rc; u_char *script_path; size_t nargs; ngx_http_lua_set_var_data_t *filter_data = data; dd("set by lua file"); if (ngx_http_lua_set_by_lua_init(r) != NGX_OK) { return NGX_ERROR; } filter_data->script.data = v[0].data; filter_data->script.len = v[0].len; /* skip the lua file path argument */ v++; nargs = filter_data->size - 1; dd("script: %.*s", (int) filter_data->script.len, filter_data->script.data); dd("nargs: %d", (int) nargs); script_path = ngx_http_lua_rebase_path(r->pool, filter_data->script.data, filter_data->script.len); if (script_path == NULL) { return NGX_ERROR; } L = ngx_http_lua_get_lua_vm(r, NULL); /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(r->connection->log, L, script_path, filter_data->key); if (rc != NGX_OK) { return NGX_ERROR; } rc = ngx_http_lua_set_by_chunk(L, r, val, v, nargs, &filter_data->script); if (rc != NGX_OK) { return NGX_ERROR; } return NGX_OK; }
ngx_int_t ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v, void *data) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; ngx_http_lua_loc_conf_t *llcf; char *err; ngx_http_lua_set_var_data_t *filter_data = data; script_path = ngx_http_lua_rebase_path(r->pool, v[0].data, v[0].len); if (script_path == NULL) { return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, script_path, filter_data->key, &err, llcf->enable_code_cache); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to load Lua file: %s", err); return NGX_ERROR; } rc = ngx_http_lua_set_by_chunk(L, r, val, v, filter_data->size); if (rc != NGX_OK) { return NGX_ERROR; } return NGX_OK; }
char * ngx_http_lua_init_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; dd("enter"); /* must specifiy a content handler */ if (cmd->post == NULL) { return NGX_CONF_ERROR; } if (lmcf->init_handler) { return "is duplicate"; } value = cf->args->elts; if (value[1].len == 0) { /* Oops...Invalid location conf */ ngx_conf_log_error(NGX_LOG_ERR, cf, 0, "invalid location config: no runnable Lua code"); return NGX_CONF_ERROR; } lmcf->init_handler = (ngx_http_lua_conf_handler_pt) cmd->post; if (cmd->post == ngx_http_lua_init_by_file) { name = ngx_http_lua_rebase_path(cf->pool, value[1].data, value[1].len); if (name == NULL) { return NGX_CONF_ERROR; } lmcf->init_src.data = name; lmcf->init_src.len = ngx_strlen(name); } else { lmcf->init_src = value[1]; } return NGX_CONF_OK; }
ngx_int_t ngx_http_lua_body_filter_file(ngx_http_request_t *r, ngx_chain_t *in) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_loc_conf_t *llcf; ngx_str_t eval_src; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); /* Eval nginx variables in code path string first */ if (ngx_http_complex_value(r, &llcf->body_filter_src, &eval_src) != NGX_OK) { return NGX_ERROR; } script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data, eval_src.len); if (script_path == NULL) { return NGX_ERROR; } L = ngx_http_lua_get_lua_vm(r, NULL); /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(r, L, script_path, llcf->body_filter_src_key); if (rc != NGX_OK) { return NGX_ERROR; } /* make sure we have a valid code chunk */ ngx_http_lua_assert(lua_isfunction(L, -1)); rc = ngx_http_lua_body_filter_by_chunk(L, r, in); if (rc != NGX_OK) { return NGX_ERROR; } return NGX_OK; }
ngx_int_t ngx_http_lua_rewrite_handler_file(ngx_http_request_t *r) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; ngx_http_lua_loc_conf_t *llcf; char *err; ngx_str_t eval_src; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); if (ngx_http_complex_value(r, &llcf->rewrite_src, &eval_src) != NGX_OK) { return NGX_ERROR; } script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data, eval_src.len); if (script_path == NULL) { return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, script_path, llcf->rewrite_src_key, &err, llcf->enable_code_cache ? 1 : 0); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "failed to load Lua file code: %s", err); return NGX_HTTP_INTERNAL_SERVER_ERROR; } return ngx_http_lua_rewrite_by_chunk(L, r); }
ngx_int_t ngx_http_lua_filter_set_by_lua_file(ngx_http_request_t *r, ngx_str_t *val, ngx_http_variable_value_t *v, void *data) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; char *err; script_path = ngx_http_lua_rebase_path(r->pool, v[0].data, v[0].len); if (script_path == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate memory to store absolute path: raw path='%v'", &v[0]); return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, (char *)script_path, &err); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to load Lua file: %s", err); return NGX_ERROR; } rc = ngx_http_lua_set_by_chunk(L, r, val, v, (size_t) data); if (rc != NGX_OK) { return NGX_ERROR; } return NGX_OK; }
ngx_int_t ngx_http_lua_content_handler_file(ngx_http_request_t *r) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_loc_conf_t *llcf; ngx_str_t eval_src; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); if (ngx_http_complex_value(r, &llcf->content_src, &eval_src) != NGX_OK) { return NGX_ERROR; } script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data, eval_src.len); if (script_path == NULL) { return NGX_ERROR; } L = ngx_http_lua_get_lua_vm(r, NULL); /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(r, L, script_path, llcf->content_src_key); if (rc != NGX_OK) { if (rc < NGX_HTTP_SPECIAL_RESPONSE) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } return rc; } /* make sure we have a valid code chunk */ ngx_http_lua_assert(lua_isfunction(L, -1)); return ngx_http_lua_content_by_chunk(L, r); }
char * ngx_http_lua_init_worker_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; dd("enter"); /* must specifiy a content handler */ if (cmd->post == NULL) { return NGX_CONF_ERROR; } if (lmcf->init_worker_handler) { return "is duplicate"; } value = cf->args->elts; lmcf->init_worker_handler = (ngx_http_lua_conf_handler_pt) cmd->post; if (cmd->post == ngx_http_lua_init_worker_by_file) { name = ngx_http_lua_rebase_path(cf->pool, value[1].data, value[1].len); if (name == NULL) { return NGX_CONF_ERROR; } lmcf->init_worker_src.data = name; lmcf->init_worker_src.len = ngx_strlen(name); } else { lmcf->init_worker_src = value[1]; } return NGX_CONF_OK; }
ngx_int_t ngx_http_lua_content_handler_file(ngx_http_request_t *r) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; ngx_http_lua_loc_conf_t *llcf; char *err; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); script_path = ngx_http_lua_rebase_path(r->pool, llcf->src.data, llcf->src.len); if (script_path == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate memory to store absolute path: raw path='%v'", &(llcf->src)); return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, (char *) script_path, &err); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to load Lua inlined code: %s", err); return NGX_HTTP_INTERNAL_SERVER_ERROR; } /* make sure we have a valid code chunk */ assert(lua_isfunction(L, -1)); rc = ngx_http_lua_content_by_chunk(L, r); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } if (rc == NGX_DONE) { return NGX_DONE; } if (rc == NGX_AGAIN) { #if defined(nginx_version) && nginx_version >= 8011 r->main->count++; #endif return NGX_DONE; } return NGX_OK; }
char * ngx_http_lua_balancer_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { u_char *p; u_char *name; ngx_str_t *value; ngx_http_lua_srv_conf_t *lscf = conf; ngx_http_upstream_srv_conf_t *uscf; dd("enter"); /* must specify a content handler */ if (cmd->post == NULL) { return NGX_CONF_ERROR; } if (lscf->balancer.handler) { return "is duplicate"; } value = cf->args->elts; lscf->balancer.handler = (ngx_http_lua_srv_conf_handler_pt) cmd->post; if (cmd->post == ngx_http_lua_balancer_handler_file) { /* Lua code in an external file */ name = ngx_http_lua_rebase_path(cf->pool, value[1].data, value[1].len); if (name == NULL) { return NGX_CONF_ERROR; } lscf->balancer.src.data = name; lscf->balancer.src.len = ngx_strlen(name); p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1); if (p == NULL) { return NGX_CONF_ERROR; } lscf->balancer.src_key = p; p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN); p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len); *p = '\0'; } else { /* inlined Lua code */ lscf->balancer.src = value[1]; p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1); if (p == NULL) { return NGX_CONF_ERROR; } lscf->balancer.src_key = p; p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN); p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len); *p = '\0'; } uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module); if (uscf->peer.init_upstream) { ngx_conf_log_error(NGX_LOG_WARN, cf, 0, "load balancing method redefined"); } uscf->peer.init_upstream = ngx_http_lua_balancer_init; uscf->flags = NGX_HTTP_UPSTREAM_CREATE |NGX_HTTP_UPSTREAM_WEIGHT |NGX_HTTP_UPSTREAM_MAX_FAILS |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT |NGX_HTTP_UPSTREAM_DOWN; return NGX_CONF_OK; }
ngx_int_t ngx_http_lua_rewrite_handler_file(ngx_http_request_t *r) { lua_State *L; ngx_int_t rc; u_char *script_path; ngx_http_lua_main_conf_t *lmcf; ngx_http_lua_loc_conf_t *llcf; char *err; ngx_str_t eval_src; llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module); if (ngx_http_complex_value(r, &llcf->rewrite_src, &eval_src) != NGX_OK) { return NGX_ERROR; } script_path = ngx_http_lua_rebase_path(r->pool, eval_src.data, eval_src.len); if (script_path == NULL) { return NGX_ERROR; } lmcf = ngx_http_get_module_main_conf(r, ngx_http_lua_module); L = lmcf->lua; /* load Lua script file (w/ cache) sp = 1 */ rc = ngx_http_lua_cache_loadfile(L, script_path, llcf->rewrite_src_key, &err, llcf->enable_code_cache); if (rc != NGX_OK) { if (err == NULL) { err = "unknown error"; } ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to load Lua inlined code: %s", err); return NGX_HTTP_INTERNAL_SERVER_ERROR; } /* make sure we have a valid code chunk */ assert(lua_isfunction(L, -1)); rc = ngx_http_lua_rewrite_by_chunk(L, r); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } if (rc == NGX_DONE) { return NGX_DONE; } if (rc == NGX_AGAIN) { return NGX_DONE; } return NGX_DECLINED; }
/* conf parser for directive ssl_session_store_by_lua */ char * ngx_http_lua_ssl_sess_store_by_lua(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { u_char *p; u_char *name; ngx_str_t *value; ngx_http_lua_srv_conf_t *lscf = conf; dd("enter"); /* must specifiy a content handler */ if (cmd->post == NULL) { return NGX_CONF_ERROR; } if (lscf->srv.ssl_sess_store_handler) { return "is duplicate"; } if (ngx_http_lua_ssl_init(cf->log) != NGX_OK) { return NGX_CONF_ERROR; } value = cf->args->elts; lscf->srv.ssl_sess_store_handler = (ngx_http_lua_srv_conf_handler_pt) cmd->post; if (cmd->post == ngx_http_lua_ssl_sess_store_handler_file) { /* Lua code in an external file */ name = ngx_http_lua_rebase_path(cf->pool, value[1].data, value[1].len); if (name == NULL) { return NGX_CONF_ERROR; } lscf->srv.ssl_sess_store_src.data = name; lscf->srv.ssl_sess_store_src.len = ngx_strlen(name); p = ngx_palloc(cf->pool, NGX_HTTP_LUA_FILE_KEY_LEN + 1); if (p == NULL) { return NGX_CONF_ERROR; } lscf->srv.ssl_sess_store_src_key = p; p = ngx_copy(p, NGX_HTTP_LUA_FILE_TAG, NGX_HTTP_LUA_FILE_TAG_LEN); p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len); *p = '\0'; } else { /* inlined Lua code */ lscf->srv.ssl_sess_store_src = value[1]; p = ngx_palloc(cf->pool, NGX_HTTP_LUA_INLINE_KEY_LEN + 1); if (p == NULL) { return NGX_CONF_ERROR; } lscf->srv.ssl_sess_store_src_key = p; p = ngx_copy(p, NGX_HTTP_LUA_INLINE_TAG, NGX_HTTP_LUA_INLINE_TAG_LEN); p = ngx_http_lua_digest_hex(p, value[1].data, value[1].len); *p = '\0'; } return NGX_CONF_OK; }