diff --git a/.luacheckrc b/.luacheckrc index 169706afe..adeeb4c07 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -3,10 +3,6 @@ std = "ngx_lua" globals = { "DEBUG", "WORKER_GROUP_ID", - "config", - "elasticsearch_templates", - "inspect", - "user_agent_parser_data", } max_line_length = false diff --git a/Taskfile.yml b/Taskfile.yml index dc380643d..7394761f9 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -643,17 +643,30 @@ tasks: - ./build/work/stamp/test-deps/elasticsearch6 method: checksum - test-deps:luacheck: + test-deps:lua:luacheck: deps: - deps:luarocks cmds: - - ./tasks/test-deps/luacheck + - ./tasks/test-deps/lua/luacheck sources: - ./build/work/stamp/deps/luarocks - - ./tasks/test-deps/luacheck + - ./tasks/test-deps/lua/luacheck - ./tasks/helpers.sh generates: - - ./build/work/stamp/test-deps/luacheck + - ./build/work/stamp/test-deps/lua/luacheck + method: checksum + + test-deps:lua:penlight: + deps: + - deps:luarocks + cmds: + - ./tasks/test-deps/lua/penlight + sources: + - ./build/work/stamp/deps/luarocks + - ./tasks/test-deps/lua/penlight + - ./tasks/helpers.sh + generates: + - ./build/work/stamp/test-deps/lua/penlight method: checksum test-deps:mailhog: @@ -721,7 +734,8 @@ tasks: - task: test-deps:bundle - task: test-deps:elasticsearch5 - task: test-deps:elasticsearch6 - - task: test-deps:luacheck + - task: test-deps:lua:luacheck + - task: test-deps:lua:penlight - task: test-deps:mailhog - task: test-deps:mongo-orchestration - task: test-deps:openldap @@ -737,10 +751,16 @@ tasks: lint:lua: deps: - - test-deps:luacheck + - test-deps:lua:luacheck cmds: - ./tasks/lint/lua + lint:resty: + deps: + - test-deps:lua:penlight + cmds: + - ./tasks/lint/resty/run + lint:ruby: deps: - test-deps:bundle @@ -757,6 +777,7 @@ tasks: cmds: - task: lint:js - task: lint:lua + - task: lint:resty - task: lint:ruby - task: lint:shell diff --git a/scripts/elasticsearch-v2-migrate/migrate.lua b/scripts/elasticsearch-v2-migrate/migrate.lua index ccca41cb7..287fe4999 100644 --- a/scripts/elasticsearch-v2-migrate/migrate.lua +++ b/scripts/elasticsearch-v2-migrate/migrate.lua @@ -1,5 +1,4 @@ -config = require "api-umbrella.proxy.models.file_config" -require "api-umbrella.proxy.startup.init_user_agent_parser_data" +local config = require "api-umbrella.proxy.models.file_config" -- local Date = require "pl.Date" local argparse = require "argparse" diff --git a/scripts/import_access_logs/import.lua b/scripts/import_access_logs/import.lua index acb3df535..97609570f 100644 --- a/scripts/import_access_logs/import.lua +++ b/scripts/import_access_logs/import.lua @@ -1,7 +1,5 @@ -config = require "api-umbrella.proxy.models.file_config" -require "api-umbrella.proxy.startup.init_user_agent_parser_data" +local config = require "api-umbrella.proxy.models.file_config" -inspect = require "inspect" local cjson = require "cjson" local elasticsearch_encode_json = require "api-umbrella.utils.elasticsearch_encode_json" local http = require "resty.http" diff --git a/src/api-umbrella/auto-ssl/hooks/init.lua b/src/api-umbrella/auto-ssl/hooks/init.lua index ad8a7f8e5..6ee9c53fd 100644 --- a/src/api-umbrella/auto-ssl/hooks/init.lua +++ b/src/api-umbrella/auto-ssl/hooks/init.lua @@ -1,7 +1,6 @@ +local config = require "api-umbrella.proxy.models.file_config" local path = require "pl.path" -config = require "api-umbrella.proxy.models.file_config" - auto_ssl = (require "resty.auto-ssl").new({ dir = path.join(config["etc_dir"], "auto-ssl"), hook_server_port = config["auto_ssl"]["hook_server"]["port"], diff --git a/src/api-umbrella/auto-ssl/storage_adapters/mongodb.lua b/src/api-umbrella/auto-ssl/storage_adapters/mongodb.lua index 5c97d26d0..86500f382 100644 --- a/src/api-umbrella/auto-ssl/storage_adapters/mongodb.lua +++ b/src/api-umbrella/auto-ssl/storage_adapters/mongodb.lua @@ -1,5 +1,5 @@ local aes = require "resty.aes" -local inspect = require "inspect" +local config = require "api-umbrella.proxy.models.file_config" local mongo = require "api-umbrella.utils.mongo" local path = require "pl.path" local resty_random = require "resty.random" @@ -54,7 +54,7 @@ function _M.get(_, key) local aes_instance = assert(aes:new(ENCRYPTION_SECRET, nil, aes.cipher(256, "cbc"), { iv = res["encryption_iv"] })) res = aes_instance:decrypt(ngx.decode_base64(res["encrypted_value"])) if not res then - ngx.log(ngx.ERR, "auto-ssl: decryption failed: ", inspect(err)) + ngx.log(ngx.ERR, "auto-ssl: decryption failed: ", (tostring(err) or "")) err = "decryption failed" end else diff --git a/src/api-umbrella/elasticsearch-aws-signing-proxy/init.lua b/src/api-umbrella/elasticsearch-aws-signing-proxy/init.lua index c42c62cd1..fc7a472bc 100644 --- a/src/api-umbrella/elasticsearch-aws-signing-proxy/init.lua +++ b/src/api-umbrella/elasticsearch-aws-signing-proxy/init.lua @@ -1,2 +1 @@ -inspect = require "inspect" -config = require "api-umbrella.proxy.models.file_config" +require "api-umbrella.proxy.models.file_config" diff --git a/src/api-umbrella/elasticsearch-aws-signing-proxy/proxy.lua b/src/api-umbrella/elasticsearch-aws-signing-proxy/proxy.lua index 687fe2ffc..7f302e0d6 100644 --- a/src/api-umbrella/elasticsearch-aws-signing-proxy/proxy.lua +++ b/src/api-umbrella/elasticsearch-aws-signing-proxy/proxy.lua @@ -1,3 +1,5 @@ +local config = require "api-umbrella.proxy.models.file_config" + local username = config["elasticsearch"]["aws_signing_proxy"]["username"] if not username then ngx.say("elasticsearch.aws_signing_proxy.username must be configured in /etc/api-umbrella/api-umbrella.yml") diff --git a/src/api-umbrella/http-api/health.lua b/src/api-umbrella/http-api/health.lua index cd43c96be..edde755e6 100644 --- a/src/api-umbrella/http-api/health.lua +++ b/src/api-umbrella/http-api/health.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local elasticsearch_query = require("api-umbrella.utils.elasticsearch").query local http = require "resty.http" local json_encode = require "api-umbrella.utils.json_encode" diff --git a/src/api-umbrella/proxy/startup/init_elasticsearch_templates_data.lua b/src/api-umbrella/proxy/elasticsearch_templates_data.lua similarity index 91% rename from src/api-umbrella/proxy/startup/init_elasticsearch_templates_data.lua rename to src/api-umbrella/proxy/elasticsearch_templates_data.lua index a0acd7c14..a75348059 100644 --- a/src/api-umbrella/proxy/startup/init_elasticsearch_templates_data.lua +++ b/src/api-umbrella/proxy/elasticsearch_templates_data.lua @@ -1,4 +1,7 @@ local cjson = require "cjson" +local config = require "api-umbrella.proxy.models.file_config" + +local elasticsearch_templates local path = os.getenv("API_UMBRELLA_SRC_ROOT") .. "/config/elasticsearch_templates_v" .. config["elasticsearch"]["template_version"] if config["elasticsearch"]["api_version"] >= 5 then @@ -41,3 +44,5 @@ else f:close() end + +return elasticsearch_templates diff --git a/src/api-umbrella/proxy/error_handler.lua b/src/api-umbrella/proxy/error_handler.lua index 10ad9935f..7ba66b902 100644 --- a/src/api-umbrella/proxy/error_handler.lua +++ b/src/api-umbrella/proxy/error_handler.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local deep_merge_overwrite_arrays = require "api-umbrella.utils.deep_merge_overwrite_arrays" local httpsify_current_url = require "api-umbrella.utils.httpsify_current_url" local is_hash = require "api-umbrella.utils.is_hash" diff --git a/src/api-umbrella/proxy/hooks/init.lua b/src/api-umbrella/proxy/hooks/init.lua index 11ce2dd77..fabc4c23c 100644 --- a/src/api-umbrella/proxy/hooks/init.lua +++ b/src/api-umbrella/proxy/hooks/init.lua @@ -1,9 +1,7 @@ DEBUG = false -- Pre-load modules. -require "resty.txid" - -inspect = require "inspect" +require "api-umbrella.proxy.hooks.init_preload_modules" -- Generate a unique ID to represent this group of worker processes. This value -- will be the same amongst all the subsequently inited workers, but the value @@ -25,11 +23,6 @@ elseif incr_err then ngx.log(ngx.ERR, "worker_group_id incr err: ", incr_err) end -config = require "api-umbrella.proxy.models.file_config" - -require "api-umbrella.proxy.startup.init_elasticsearch_templates_data" -require "api-umbrella.proxy.startup.init_user_agent_parser_data" - ngx.shared.stats:delete("distributed_last_fetched_at") ngx.shared.api_users:delete("last_fetched_at") ngx.shared.active_config:set("elasticsearch_templates_created", false) diff --git a/src/api-umbrella/proxy/hooks/init_preload_modules.lua b/src/api-umbrella/proxy/hooks/init_preload_modules.lua new file mode 100644 index 000000000..1a11d4c83 --- /dev/null +++ b/src/api-umbrella/proxy/hooks/init_preload_modules.lua @@ -0,0 +1,69 @@ +-- Pre-load modules. +require "api-umbrella.proxy.distributed_rate_limit_queue" +require "api-umbrella.proxy.elasticsearch_templates_data" +require "api-umbrella.proxy.error_handler" +require "api-umbrella.proxy.jobs.distributed_rate_limit_puller" +require "api-umbrella.proxy.jobs.distributed_rate_limit_pusher" +require "api-umbrella.proxy.jobs.elasticsearch_setup" +require "api-umbrella.proxy.jobs.load_api_users" +require "api-umbrella.proxy.jobs.load_db_config" +require "api-umbrella.proxy.log_utils" +require "api-umbrella.proxy.middleware.api_key_validator" +require "api-umbrella.proxy.middleware.api_matcher" +require "api-umbrella.proxy.middleware.api_settings" +require "api-umbrella.proxy.middleware.https_validator" +require "api-umbrella.proxy.middleware.ip_validator" +require "api-umbrella.proxy.middleware.rate_limit" +require "api-umbrella.proxy.middleware.referer_validator" +require "api-umbrella.proxy.middleware.rewrite_request" +require "api-umbrella.proxy.middleware.rewrite_response" +require "api-umbrella.proxy.middleware.role_validator" +require "api-umbrella.proxy.middleware.user_settings" +require "api-umbrella.proxy.middleware.website_matcher" +require "api-umbrella.proxy.models.active_config" +require "api-umbrella.proxy.models.db_config" +require "api-umbrella.proxy.models.file_config" +require "api-umbrella.proxy.startup.seed_database" +require "api-umbrella.proxy.user_agent_parser" +require "api-umbrella.proxy.user_agent_parser_data" +require "api-umbrella.proxy.user_store" +require "api-umbrella.proxy.utils" +require "api-umbrella.utils.array_last" +require "api-umbrella.utils.deep_merge_overwrite_arrays" +require "api-umbrella.utils.elasticsearch" +require "api-umbrella.utils.escape_regex" +require "api-umbrella.utils.escape_uri_non_ascii" +require "api-umbrella.utils.flatten_headers" +require "api-umbrella.utils.host_normalize" +require "api-umbrella.utils.httpsify_current_url" +require "api-umbrella.utils.interval_lock" +require "api-umbrella.utils.invert_table" +require "api-umbrella.utils.is_hash" +require "api-umbrella.utils.matches_hostname" +require "api-umbrella.utils.mongo" +require "api-umbrella.utils.mustache_unescape" +require "api-umbrella.utils.nillify_json_nulls" +require "api-umbrella.utils.nillify_yaml_nulls" +require "api-umbrella.utils.random_token" +require "api-umbrella.utils.redirect_matches_to_https" +require "cjson" +require "cmsgpack" +require "iconv" +require "icu-date" +require "libcidr-ffi" +require "lustache" +require "lyaml" +require "pl.path" +require "pl.seq" +require "pl.stringx" +require "pl.tablex" +require "pl.types" +require "pl.utils" +require "resty.logger.socket" +require "resty.lrucache.pureffi" +require "resty.sha256" +require "resty.string" +require "resty.txid" +require "resty.uuid" +require "shcache" +require "socket.url" diff --git a/src/api-umbrella/proxy/hooks/rewrite.lua b/src/api-umbrella/proxy/hooks/rewrite.lua index 6028a89aa..7ea076f1f 100644 --- a/src/api-umbrella/proxy/hooks/rewrite.lua +++ b/src/api-umbrella/proxy/hooks/rewrite.lua @@ -1,4 +1,5 @@ local api_matcher = require "api-umbrella.proxy.middleware.api_matcher" +local config = require "api-umbrella.proxy.models.file_config" local error_handler = require "api-umbrella.proxy.error_handler" local host_normalize = require "api-umbrella.utils.host_normalize" local redirect_matches_to_https = require "api-umbrella.utils.redirect_matches_to_https" diff --git a/src/api-umbrella/proxy/hooks/set_x_api_umbrella_request_id.lua b/src/api-umbrella/proxy/hooks/set_x_api_umbrella_request_id.lua new file mode 100644 index 000000000..4210087c4 --- /dev/null +++ b/src/api-umbrella/proxy/hooks/set_x_api_umbrella_request_id.lua @@ -0,0 +1,2 @@ +local txid = require "resty.txid" +return txid() diff --git a/src/api-umbrella/proxy/jobs/distributed_rate_limit_pusher.lua b/src/api-umbrella/proxy/jobs/distributed_rate_limit_pusher.lua index d9fcb6fe7..8d206cf23 100644 --- a/src/api-umbrella/proxy/jobs/distributed_rate_limit_pusher.lua +++ b/src/api-umbrella/proxy/jobs/distributed_rate_limit_pusher.lua @@ -1,6 +1,7 @@ local _M = {} local array_last = require "api-umbrella.utils.array_last" +local config = require "api-umbrella.proxy.models.file_config" local distributed_rate_limit_queue = require "api-umbrella.proxy.distributed_rate_limit_queue" local mongo = require "api-umbrella.utils.mongo" local plutils = require "pl.utils" diff --git a/src/api-umbrella/proxy/jobs/elasticsearch_setup.lua b/src/api-umbrella/proxy/jobs/elasticsearch_setup.lua index 0d1e16251..306d27352 100644 --- a/src/api-umbrella/proxy/jobs/elasticsearch_setup.lua +++ b/src/api-umbrella/proxy/jobs/elasticsearch_setup.lua @@ -1,6 +1,8 @@ local _M = {} +local config = require "api-umbrella.proxy.models.file_config" local elasticsearch_query = require("api-umbrella.utils.elasticsearch").query +local elasticsearch_templates = require "api-umbrella.proxy.elasticsearch_templates_data" local interval_lock = require "api-umbrella.utils.interval_lock" local delay = 3600 -- in seconds diff --git a/src/api-umbrella/proxy/log_utils.lua b/src/api-umbrella/proxy/log_utils.lua index d4a92f4ec..2f3e74c64 100644 --- a/src/api-umbrella/proxy/log_utils.lua +++ b/src/api-umbrella/proxy/log_utils.lua @@ -1,4 +1,5 @@ local cjson = require "cjson" +local config = require "api-umbrella.proxy.models.file_config" local escape_uri_non_ascii = require "api-umbrella.utils.escape_uri_non_ascii" local iconv = require "iconv" local icu_date = require "icu-date" diff --git a/src/api-umbrella/proxy/middleware/api_key_validator.lua b/src/api-umbrella/proxy/middleware/api_key_validator.lua index ab1447b32..fb7181b1c 100644 --- a/src/api-umbrella/proxy/middleware/api_key_validator.lua +++ b/src/api-umbrella/proxy/middleware/api_key_validator.lua @@ -1,5 +1,6 @@ -local user_store = require "api-umbrella.proxy.user_store" +local config = require "api-umbrella.proxy.models.file_config" local types = require "pl.types" +local user_store = require "api-umbrella.proxy.user_store" local get_user = user_store.get local is_empty = types.is_empty diff --git a/src/api-umbrella/proxy/middleware/api_matcher.lua b/src/api-umbrella/proxy/middleware/api_matcher.lua index b1910f681..4eafe8b55 100644 --- a/src/api-umbrella/proxy/middleware/api_matcher.lua +++ b/src/api-umbrella/proxy/middleware/api_matcher.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local matches_hostname = require "api-umbrella.utils.matches_hostname" local stringx = require "pl.stringx" local utils = require "api-umbrella.proxy.utils" diff --git a/src/api-umbrella/proxy/middleware/api_settings.lua b/src/api-umbrella/proxy/middleware/api_settings.lua index cb245d3e7..c54dd2856 100644 --- a/src/api-umbrella/proxy/middleware/api_settings.lua +++ b/src/api-umbrella/proxy/middleware/api_settings.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local deep_merge_overwrite_arrays = require "api-umbrella.utils.deep_merge_overwrite_arrays" local seq = require "pl.seq" local tablex = require "pl.tablex" diff --git a/src/api-umbrella/proxy/middleware/rate_limit.lua b/src/api-umbrella/proxy/middleware/rate_limit.lua index 6619f7047..9700f36e3 100644 --- a/src/api-umbrella/proxy/middleware/rate_limit.lua +++ b/src/api-umbrella/proxy/middleware/rate_limit.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local distributed_rate_limit_queue = require "api-umbrella.proxy.distributed_rate_limit_queue" local function bucket_keys(settings, user, limit, current_time) diff --git a/src/api-umbrella/proxy/middleware/rewrite_request.lua b/src/api-umbrella/proxy/middleware/rewrite_request.lua index e2489f1ea..ddb1c8408 100644 --- a/src/api-umbrella/proxy/middleware/rewrite_request.lua +++ b/src/api-umbrella/proxy/middleware/rewrite_request.lua @@ -1,4 +1,4 @@ -local inspect = require "inspect" +local config = require "api-umbrella.proxy.models.file_config" local lustache = require "lustache" local plutils = require "pl.utils" local stringx = require "pl.stringx" @@ -115,7 +115,7 @@ local function set_headers(settings) if ok then value = output else - ngx.log(ngx.ERR, "Mustache rendering error while rendering error template: " .. inspect(output)) + ngx.log(ngx.ERR, "Mustache rendering error while rendering error template: " .. (tostring(output) or "")) end else value = header["value"] @@ -236,7 +236,7 @@ local function url_rewrites(api) if ok then new_uri = output else - ngx.log(ngx.ERR, "Mustache rendering error while rendering error template: " .. inspect(output)) + ngx.log(ngx.ERR, "Mustache rendering error while rendering error template: " .. (tostring(output) or "")) end if rewrite["_backend_replacement_args"] then @@ -248,7 +248,7 @@ local function url_rewrites(api) if ok then new_uri = new_uri .. "?" .. output else - ngx.log(ngx.ERR, "Mustache rendering error while rendering error template: " .. inspect(output)) + ngx.log(ngx.ERR, "Mustache rendering error while rendering error template: " .. (tostring(output) or "")) end end end diff --git a/src/api-umbrella/proxy/middleware/rewrite_response.lua b/src/api-umbrella/proxy/middleware/rewrite_response.lua index 0809facde..0f41c332b 100644 --- a/src/api-umbrella/proxy/middleware/rewrite_response.lua +++ b/src/api-umbrella/proxy/middleware/rewrite_response.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local stringx = require "pl.stringx" local url = require "socket.url" local utils = require "api-umbrella.proxy.utils" diff --git a/src/api-umbrella/proxy/middleware/website_matcher.lua b/src/api-umbrella/proxy/middleware/website_matcher.lua index 86132b684..dfcd9e0b0 100644 --- a/src/api-umbrella/proxy/middleware/website_matcher.lua +++ b/src/api-umbrella/proxy/middleware/website_matcher.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local matches_hostname = require "api-umbrella.utils.matches_hostname" return function(active_config) diff --git a/src/api-umbrella/proxy/models/active_config.lua b/src/api-umbrella/proxy/models/active_config.lua index 6788888ed..66f66c20d 100644 --- a/src/api-umbrella/proxy/models/active_config.lua +++ b/src/api-umbrella/proxy/models/active_config.lua @@ -1,13 +1,14 @@ local cidr = require "libcidr-ffi" local cjson = require "cjson" +local config = require "api-umbrella.proxy.models.file_config" local escape_regex = require "api-umbrella.utils.escape_regex" local host_normalize = require "api-umbrella.utils.host_normalize" local mustache_unescape = require "api-umbrella.utils.mustache_unescape" local plutils = require "pl.utils" local random_token = require "api-umbrella.utils.random_token" +local startswith = require("pl.stringx").startswith local tablex = require "pl.tablex" local utils = require "api-umbrella.proxy.utils" -local startswith = require("pl.stringx").startswith local append_array = utils.append_array local cache_computed_settings = utils.cache_computed_settings diff --git a/src/api-umbrella/proxy/startup/seed_database.lua b/src/api-umbrella/proxy/startup/seed_database.lua index a2349426e..ee0c74013 100644 --- a/src/api-umbrella/proxy/startup/seed_database.lua +++ b/src/api-umbrella/proxy/startup/seed_database.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local deep_merge_overwrite_arrays = require "api-umbrella.utils.deep_merge_overwrite_arrays" local interval_lock = require "api-umbrella.utils.interval_lock" local mongo = require "api-umbrella.utils.mongo" diff --git a/src/api-umbrella/proxy/user_agent_parser.lua b/src/api-umbrella/proxy/user_agent_parser.lua index 4d2952c01..4b2460ecf 100644 --- a/src/api-umbrella/proxy/user_agent_parser.lua +++ b/src/api-umbrella/proxy/user_agent_parser.lua @@ -1,6 +1,7 @@ local lrucache = require "resty.lrucache.pureffi" +local data = require "api-umbrella.proxy.user_agent_parser_data" -local data = user_agent_parser_data +-- local data = user_agent_parser_data local cache = lrucache.new(500) return function(user_agent) diff --git a/src/api-umbrella/proxy/startup/init_user_agent_parser_data.lua b/src/api-umbrella/proxy/user_agent_parser_data.lua similarity index 88% rename from src/api-umbrella/proxy/startup/init_user_agent_parser_data.lua rename to src/api-umbrella/proxy/user_agent_parser_data.lua index 9d7ed18c8..bb0941dfa 100644 --- a/src/api-umbrella/proxy/startup/init_user_agent_parser_data.lua +++ b/src/api-umbrella/proxy/user_agent_parser_data.lua @@ -1,5 +1,7 @@ local cjson = require "cjson" +local user_agent_parser_data + local path = os.getenv("API_UMBRELLA_SRC_ROOT") .. "/config/user_agent_data.json" local f, err = io.open(path, "rb") if err then @@ -17,3 +19,5 @@ else f:close() end + +return user_agent_parser_data diff --git a/src/api-umbrella/proxy/user_store.lua b/src/api-umbrella/proxy/user_store.lua index 6ca87e4e2..a25331e2a 100644 --- a/src/api-umbrella/proxy/user_store.lua +++ b/src/api-umbrella/proxy/user_store.lua @@ -1,7 +1,8 @@ local _M = {} -local cmsgpack = require "cmsgpack" local cjson = require "cjson" +local cmsgpack = require "cmsgpack" +local config = require "api-umbrella.proxy.models.file_config" local invert_table = require "api-umbrella.utils.invert_table" local lrucache = require "resty.lrucache.pureffi" local mongo = require "api-umbrella.utils.mongo" diff --git a/src/api-umbrella/utils/elasticsearch.lua b/src/api-umbrella/utils/elasticsearch.lua index d4cc77273..b497c962a 100644 --- a/src/api-umbrella/utils/elasticsearch.lua +++ b/src/api-umbrella/utils/elasticsearch.lua @@ -1,3 +1,4 @@ +local config = require "api-umbrella.proxy.models.file_config" local http = require "resty.http" local is_empty = require("pl.types").is_empty local json_decode = require("cjson").decode diff --git a/src/api-umbrella/utils/httpsify_current_url.lua b/src/api-umbrella/utils/httpsify_current_url.lua index e2363f226..7043e5089 100644 --- a/src/api-umbrella/utils/httpsify_current_url.lua +++ b/src/api-umbrella/utils/httpsify_current_url.lua @@ -1,3 +1,5 @@ +local config = require "api-umbrella.proxy.models.file_config" + return function() local https_url = { config["override_public_https_proto"] or "https", diff --git a/src/api-umbrella/utils/mongo.lua b/src/api-umbrella/utils/mongo.lua index 0451880bb..168d6004d 100644 --- a/src/api-umbrella/utils/mongo.lua +++ b/src/api-umbrella/utils/mongo.lua @@ -1,4 +1,5 @@ local cjson = require "cjson" +local config = require "api-umbrella.proxy.models.file_config" local http = require "resty.http" local stringx = require "pl.stringx" local types = require "pl.types" diff --git a/tasks/lint/lua b/tasks/lint/lua index df8e13f90..36c17fa3d 100755 --- a/tasks/lint/lua +++ b/tasks/lint/lua @@ -7,6 +7,11 @@ set +x export LUA_PATH="$TEST_VENDOR_LUA_SHARE_DIR/?.lua;$TEST_VENDOR_LUA_SHARE_DIR/?/init.lua;;" export LUA_CPATH="$TEST_VENDOR_LUA_LIB_DIR/?.so;;" -mapfile -t files < <(git ls-files | grep '\.lua$') +mapfile -t lua_files < <(git ls-files | grep '\.lua$') +mapfile -t shebang_files < <(git grep -El "^#!/.*(resty|lua)" || true) +files=( + "${lua_files[@]}" + "${shebang_files[@]}" +) set -x "$TEST_VENDOR_DIR/bin/luacheck" "${files[@]}" diff --git a/tasks/lint/resty/check_preload b/tasks/lint/resty/check_preload new file mode 100755 index 000000000..073686456 --- /dev/null +++ b/tasks/lint/resty/check_preload @@ -0,0 +1,106 @@ +#!/usr/bin/env resty +-- vi: set ft=lua : + +local dir = require "pl.dir" +local file = require "pl.file" +local lexer = require "pl.lexer" +local path = require "pl.path" + +local function parse_require_paths(file_path) + local source = file.read(file_path) + if not source then + error("Could not read file " .. file_path) + return + end + + local require_paths = {} + local next_string_is_require_path = false + for t, v in lexer.lua(source) do + if t == "iden" and v == "require" then + next_string_is_require_path = true + end + + if next_string_is_require_path and t == "string" then + require_paths[v] = true + next_string_is_require_path = false + end + end + + return require_paths +end + +local function parse_require_paths_in_dir(src_dir, preload_file) + local require_paths = {} + for file_path in dir.getallfiles(path.abspath(src_dir), "*.lua"):iter() do + if file_path ~= preload_file then + local file_require_paths = parse_require_paths(file_path) + for file_require_path, _ in pairs(file_require_paths) do + require_paths[file_require_path] = true + end + end + end + + return require_paths +end + +local function check(src_dir, preload_file) + local preload_require_path = string.gsub(preload_file, "^src/", "") + preload_require_path = string.gsub(preload_require_path, "%.lua$", "") + preload_require_path = string.gsub(preload_require_path, "/", ".") + + src_dir = path.abspath(src_dir) + preload_file = path.abspath(preload_file) + + local dir_require_paths = parse_require_paths_in_dir(src_dir, preload_file) + local preload_require_paths = parse_require_paths(preload_file) + local missing_preload_require_paths = {} + local extra_preload_require_paths = {} + for require_path, _ in pairs(dir_require_paths) do + if not preload_require_paths[require_path] and require_path ~= preload_require_path then + table.insert(missing_preload_require_paths, require_path) + end + end + for require_path, _ in pairs(preload_require_paths) do + if not dir_require_paths[require_path] then + table.insert(extra_preload_require_paths, require_path) + end + end + + local ok = true + if #missing_preload_require_paths > 0 then + print("Error: Missing expected require statements in " .. preload_file) + print("Missing requires to add:\n") + + table.sort(missing_preload_require_paths) + for _, require_path in ipairs(missing_preload_require_paths) do + print('require "' .. require_path .. '"') + end + print("") + + ok = false + end + + if #extra_preload_require_paths > 0 then + print("Error: Extra require statements in " .. preload_file) + print("Extra requires to remove:\n") + + table.sort(extra_preload_require_paths) + for _, require_path in ipairs(extra_preload_require_paths) do + print('require "' .. require_path .. '"') + end + print("") + + ok = false + end + + if ok then + print(preload_file .. ": OK") + end + + return ok +end + +local ok = check("src/api-umbrella/proxy", "src/api-umbrella/proxy/hooks/init_preload_modules.lua") +if not ok then + os.exit(1) +end diff --git a/tasks/lint/resty/run b/tasks/lint/resty/run new file mode 100755 index 000000000..d1d3951f2 --- /dev/null +++ b/tasks/lint/resty/run @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e -u -x +source ./tasks/helpers.sh +set +x + +export LUA_PATH="$TEST_VENDOR_LUA_SHARE_DIR/?.lua;$TEST_VENDOR_LUA_SHARE_DIR/?/init.lua;;" +export LUA_CPATH="$TEST_VENDOR_LUA_LIB_DIR/?.so;;" +export PATH="$STAGE_EMBEDDED_PATH" +export LD_LIBRARY_PATH="$STAGE_EMBEDDED_DIR/openresty/luajit/lib:$STAGE_EMBEDDED_DIR/lib:${LD_LIBRARY_PATH:-}" + +set -x +"$SOURCE_DIR/tasks/lint/resty/check_preload" diff --git a/tasks/test-deps/luacheck b/tasks/test-deps/lua/luacheck similarity index 100% rename from tasks/test-deps/luacheck rename to tasks/test-deps/lua/luacheck diff --git a/tasks/test-deps/lua/penlight b/tasks/test-deps/lua/penlight new file mode 100755 index 000000000..080103540 --- /dev/null +++ b/tasks/test-deps/lua/penlight @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +lua_penlight_version="1.5.4-1" + +set -e -u -x +source ./tasks/helpers.sh + +test_luarocks_install "penlight" "$lua_penlight_version" + +stamp diff --git a/templates/etc/nginx/gatekeeper.conf.mustache b/templates/etc/nginx/gatekeeper.conf.mustache index 020e447d8..1bec0bcda 100644 --- a/templates/etc/nginx/gatekeeper.conf.mustache +++ b/templates/etc/nginx/gatekeeper.conf.mustache @@ -1,7 +1,4 @@ -set_by_lua_block $x_api_umbrella_request_id { - local txid = require "resty.txid" - return txid() -} +set_by_lua_file $x_api_umbrella_request_id "{{_src_root_dir}}/src/api-umbrella/proxy/hooks/set_x_api_umbrella_request_id.lua"; proxy_set_header X-Api-Umbrella-Request-ID $x_api_umbrella_request_id; # Don't buffer proxied requests to allow for streaming APIs.