diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua index a86e14bad85a8886f621bcc967249b3c4db25dbd..871bdbd356a6fdf65f1d67199b3681c9b0a3dffc 100644 --- a/src/lua/bsdsocket.lua +++ b/src/lua/bsdsocket.lua @@ -205,6 +205,7 @@ socket_methods.nonblock = function(self, nb) end end +local waiters_mt = { __serialize = 'mapping' } local function wait_safely(self, what, timeout) local fd = check_socket(self) local f = fiber.self() @@ -214,7 +215,7 @@ local function wait_safely(self, what, timeout) timeout = timeout or TIMEOUT_INFINITY if self.waiters == nil then - self.waiters = {} + self.waiters = setmetatable({}, waiters_mt) end self.waiters[fid] = true @@ -1072,6 +1073,11 @@ socket_mt = { end self._errno = save_errno return name + end, + __serialize = function(self) + -- Allow YAML, MsgPack and JSON to dump objects with sockets + local fd = check_socket(self) + return { fd = fd, peer = self:peer(), name = self:name() } end } diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result index c803cb769e4a245c8ed807e44cab187dd78a1f45..ccc0973dea38030d9b48b65242cb2c55859ef2ea 100644 --- a/test/box/bsdsocket.result +++ b/test/box/bsdsocket.result @@ -1,6 +1,9 @@ json = require 'json' --- ... +yaml = require 'yaml' +--- +... pickle = require 'pickle' --- ... @@ -265,7 +268,7 @@ s:getsockopt('SOL_SOCKET', 'SO_DEBUG') ... s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1) --- -- error: 'builtin/socket.lua:340: Socket option SO_ACCEPTCONN is read only' +- error: 'builtin/socket.lua:341: Socket option SO_ACCEPTCONN is read only' ... s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32 --- @@ -1312,3 +1315,27 @@ os.remove(path) --- - true ... +-- Test serializers with sockets +s = socket('AF_UNIX', 'SOCK_STREAM', 'ip') +--- +... +x = s:wait() +--- +... +-- waiters is map +s.waiters +--- +- {} +... +-- check __serialize hook +json.decode(json.encode(s)).fd == s:fd() +--- +- true +... +yaml.decode(yaml.encode(s)).fd == s:fd() +--- +- true +... +s = nil +--- +... diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua index 23d527bfbcc2ed26e29c98f58fb4a62bda60ce6c..7ead95599262bb1498d51354ba5cd88928b7ed1b 100644 --- a/test/box/bsdsocket.test.lua +++ b/test/box/bsdsocket.test.lua @@ -1,4 +1,5 @@ json = require 'json' +yaml = require 'yaml' pickle = require 'pickle' socket = require 'socket' fiber = require 'fiber' @@ -445,3 +446,13 @@ collectgarbage('collect') collectgarbage('collect') socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED os.remove(path) + +-- Test serializers with sockets +s = socket('AF_UNIX', 'SOCK_STREAM', 'ip') +x = s:wait() +-- waiters is map +s.waiters +-- check __serialize hook +json.decode(json.encode(s)).fd == s:fd() +yaml.decode(yaml.encode(s)).fd == s:fd() +s = nil