diff --git a/src/lua/box_net_box.lua b/src/lua/box_net_box.lua index 9c629d262b1a19abb5f9520379203060089d0753..43f9764c71d61e874bfb9bdd8974ad6c02d3ce90 100644 --- a/src/lua/box_net_box.lua +++ b/src/lua/box_net_box.lua @@ -8,6 +8,7 @@ local errno = require 'errno' local ffi = require 'ffi' local digest = require 'digest' local yaml = require 'yaml' +local urilib = require 'uri' -- packet codes local OK = 0 @@ -347,6 +348,32 @@ local remote_methods = { setmetatable(self, getmetatable(remote)) end + + -- uri as the first argument + if opts == nil then + opts = {} + if type(port) == 'table' then + opts = port + port = nil + end + + if port == nil then + + local address = urilib.parse(tostring(host)) + if address == nil or address.service == nil then + box.error(box.error.PROC_LUA, + "usage: remote:new(uri[, opts] | host, port[, opts])") + end + + host = address.host + port = address.service + + opts.user = address.login or opts.user + opts.password = address.password or opts.password + end + end + + self.is_instance = true self.host = host self.port = port diff --git a/test/box/box.net.box.result b/test/box/box.net.box.result index 0515000fc8adb7c36aa5133744079dd09e70b81b..b7bd596ad36dcc9b7ff460699d2a67be2ed4e253 100644 --- a/test/box/box.net.box.result +++ b/test/box/box.net.box.result @@ -141,7 +141,7 @@ cn.space.net_box_test_space:insert{234, 1,2,3} ... cn.space.net_box_test_space.insert{234, 1,2,3} --- -- error: 'builtin/net.box.lua:228: Use space:method(...) instead space.method(...)' +- error: 'builtin/net.box.lua:229: Use space:method(...) instead space.method(...)' ... cn.space.net_box_test_space:replace{354, 1,2,3} --- @@ -603,3 +603,34 @@ remote.self.call('console_test') --- - error: 'usage: remote:call(proc_name, ...)' ... +-- uri as the first argument +uri = string.format('%s:%s@%s:%s', 'netbox', 'test', LISTEN.host, LISTEN.service) +--- +... +cn = remote.new(uri) +--- +... +cn:ping() +--- +- true +... +cn:close() +--- +... +uri = string.format('%s@%s:%s', 'netbox', LISTEN.host, LISTEN.service) +--- +... +remote.new(uri) +--- +- error: 'net.box: password is not defined' +... +cn = remote.new(uri, { password = 'test' }) +--- +... +cn:ping() +--- +- true +... +cn:close() +--- +... diff --git a/test/box/box.net.box.test.lua b/test/box/box.net.box.test.lua index 97c4f6015a41c62da5084ccae64139a6bb4fd97b..e1b7396b052abe0e74b7ac37f9759e8433b61377 100644 --- a/test/box/box.net.box.test.lua +++ b/test/box/box.net.box.test.lua @@ -238,3 +238,17 @@ cn.ping() remote.self:call('console_test') remote.self.call('console_test') + +-- uri as the first argument +uri = string.format('%s:%s@%s:%s', 'netbox', 'test', LISTEN.host, LISTEN.service) + +cn = remote.new(uri) +cn:ping() +cn:close() + +uri = string.format('%s@%s:%s', 'netbox', LISTEN.host, LISTEN.service) +remote.new(uri) +cn = remote.new(uri, { password = 'test' }) +cn:ping() +cn:close() +