diff --git a/lib/resty/etcd.lua b/lib/resty/etcd.lua index 30ecc46c..71f604b6 100644 --- a/lib/resty/etcd.lua +++ b/lib/resty/etcd.lua @@ -1,22 +1,9 @@ local etcdv3 = require("resty.etcd.v3") local typeof = require("typeof") -local require = require -local pcall = pcall local _M = {version = 0.9} -local function require_serializer(serializer_name) - if serializer_name then - local ok, module = pcall(require, "resty.etcd.serializers." .. serializer_name) - if ok then - return module - end - end - - return require("resty.etcd.serializers.json") -end - function _M.new(opts) opts = opts or {} if not typeof.table(opts) then @@ -33,7 +20,7 @@ function _M.new(opts) opts.ttl = opts.ttl or -1 local serializer_name = typeof.string(opts.serializer) and opts.serializer - opts.serializer = require_serializer(serializer_name) + opts.serializer = serializer_name opts.api_prefix = "/v3" return etcdv3.new(opts) diff --git a/lib/resty/etcd/v3.lua b/lib/resty/etcd/v3.lua index c094e1fa..846c2900 100644 --- a/lib/resty/etcd/v3.lua +++ b/lib/resty/etcd/v3.lua @@ -1,4 +1,5 @@ -- https://github.com/ledgetech/lua-resty-http +local require = require local split = require("ngx.re").split local typeof = require("typeof") local cjson = require("cjson.safe") @@ -27,6 +28,7 @@ local decode_base64 = ngx.decode_base64 local semaphore = require("ngx.semaphore") local health_check = require("resty.etcd.health_check") local pl_path = require("pl.path") +local pcall = pcall math.randomseed(now() * 1000 + ngx.worker.pid()) @@ -265,6 +267,17 @@ local function serialize_and_encode_base64(serialize_fn, data) return encode_base64(data) end +local function require_serializer(serializer_name) + if serializer_name then + local ok, module = pcall(require, "resty.etcd.serializers." .. serializer_name) + if ok then + return module + end + end + + return require("resty.etcd.serializers.json") +end + function _M.new(opts) local timeout = opts.timeout @@ -278,7 +291,7 @@ function _M.new(opts) if ssl_verify == nil then ssl_verify = true end - local serializer = opts.serializer + local serializer = require_serializer(opts.serializer) local extra_headers = opts.extra_headers local sni = opts.sni local unix_socket_proxy = opts.unix_socket_proxy diff --git a/t/v3/serializer.t b/t/v3/serializer.t index 026020f7..998f6897 100644 --- a/t/v3/serializer.t +++ b/t/v3/serializer.t @@ -212,3 +212,59 @@ checked val as expect: 111 checked val as expect: "foo" checked val as expect: {"a":1} checked val as expect: + +=== TEST 5: resty.etcd.v3 serializer +--- http_config eval: $::HttpConfig +--- config + location /t { + content_by_lua_block { + local cjson = require("cjson.safe") + + local etcd, err = require("resty.etcd.v3").new({ + timeout = 5, + http_host = "http://127.0.0.1:2379", + ttl = -1, + api_prefix = "/v3", + serializer = "raw" + }) + check_res(etcd, err) + + local res + res, err = etcd:rmdir("/dir") + check_res(res, err, nil, 200) + + res, err = etcd:set("/dir/v3/a", '"foo"') + check_res(res, err) + + res, err = etcd:get("/dir/v3/a") + check_res(res, err, '"foo"') + + local s = cjson.encode({a = 1}) + res, err = etcd:setx("/dir/v3/a", s) + check_res(res, err, nil, 200) + + res, err = etcd:get("/dir/v3/a") + check_res(res, err, s, 200) + + res, err = etcd:setnx("/dir/v3/not_exist", "") + check_res(res, err, nil, 200) + + res, err = etcd:get("/dir/v3/not_exist") + check_res(res, err, "", 200) + + res, err = etcd:rmdir("/dir") + check_res(res, err, nil, 200) + + res, err = etcd:set("/dir/v3/b", 111) + check_res(res, err) + } + } +--- request +GET /t +--- no_error_log +[error] +--- response_body +checked val as expect: "foo" +checked val as expect: {"a":1} +checked val as expect: +err: unsupported type for number