Mercurial > prosody-hg
comparison net/server_epoll.lua @ 10233:600eee3c4752
net.server: Accept and save an 'extra' field for client connections
This lets code attach some extra data to be attached to client
connections.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sun, 01 Sep 2019 01:55:55 +0200 |
| parents | e77bf4222fae |
| children | d4390c427a66 |
comparison
equal
deleted
inserted
replaced
| 10232:58685d77c07c | 10233:600eee3c4752 |
|---|---|
| 558 self:on("disconnect", err); | 558 self:on("disconnect", err); |
| 559 self:destroy(); | 559 self:destroy(); |
| 560 end | 560 end |
| 561 end | 561 end |
| 562 | 562 |
| 563 local function wrapsocket(client, server, read_size, listeners, tls_ctx) -- luasocket object -> interface object | 563 local function wrapsocket(client, server, read_size, listeners, tls_ctx, extra) -- luasocket object -> interface object |
| 564 client:settimeout(0); | 564 client:settimeout(0); |
| 565 local conn = setmetatable({ | 565 local conn = setmetatable({ |
| 566 conn = client; | 566 conn = client; |
| 567 _server = server; | 567 _server = server; |
| 568 created = gettime(); | 568 created = gettime(); |
| 570 read_size = read_size or (server and server.read_size); | 570 read_size = read_size or (server and server.read_size); |
| 571 writebuffer = {}; | 571 writebuffer = {}; |
| 572 tls_ctx = tls_ctx or (server and server.tls_ctx); | 572 tls_ctx = tls_ctx or (server and server.tls_ctx); |
| 573 tls_direct = server and server.tls_direct; | 573 tls_direct = server and server.tls_direct; |
| 574 log = logger.init(("conn%s"):format(new_id())); | 574 log = logger.init(("conn%s"):format(new_id())); |
| 575 extra = extra; | |
| 575 }, interface_mt); | 576 }, interface_mt); |
| 576 | 577 |
| 577 conn:updatenames(); | 578 conn:updatenames(); |
| 578 return conn; | 579 return conn; |
| 579 end | 580 end |
| 699 tls_direct = tls_ctx and true or false; | 700 tls_direct = tls_ctx and true or false; |
| 700 }); | 701 }); |
| 701 end | 702 end |
| 702 | 703 |
| 703 -- COMPAT | 704 -- COMPAT |
| 704 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx) | 705 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra) |
| 705 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx); | 706 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra); |
| 706 if not client.peername then | 707 if not client.peername then |
| 707 client.peername, client.peerport = addr, port; | 708 client.peername, client.peerport = addr, port; |
| 708 end | 709 end |
| 709 local ok, err = client:init(); | 710 local ok, err = client:init(); |
| 710 if not ok then return ok, err; end | 711 if not ok then return ok, err; end |
| 713 end | 714 end |
| 714 return client; | 715 return client; |
| 715 end | 716 end |
| 716 | 717 |
| 717 -- New outgoing TCP connection | 718 -- New outgoing TCP connection |
| 718 local function addclient(addr, port, listeners, read_size, tls_ctx, typ) | 719 local function addclient(addr, port, listeners, read_size, tls_ctx, typ, extra) |
| 719 local create; | 720 local create; |
| 720 if not typ then | 721 if not typ then |
| 721 local n = inet_pton(addr); | 722 local n = inet_pton(addr); |
| 722 if not n then return nil, "invalid-ip"; end | 723 if not n then return nil, "invalid-ip"; end |
| 723 if #n == 16 then | 724 if #n == 16 then |
| 736 if not conn then return conn, err; end | 737 if not conn then return conn, err; end |
| 737 local ok, err = conn:settimeout(0); | 738 local ok, err = conn:settimeout(0); |
| 738 if not ok then return ok, err; end | 739 if not ok then return ok, err; end |
| 739 local ok, err = conn:setpeername(addr, port); | 740 local ok, err = conn:setpeername(addr, port); |
| 740 if not ok and err ~= "timeout" then return ok, err; end | 741 if not ok and err ~= "timeout" then return ok, err; end |
| 741 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx) | 742 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra) |
| 742 local ok, err = client:init(); | 743 local ok, err = client:init(); |
| 743 if not ok then return ok, err; end | 744 if not ok then return ok, err; end |
| 744 if tls_ctx then | 745 if tls_ctx then |
| 745 client:starttls(tls_ctx); | 746 client:starttls(tls_ctx); |
| 746 end | 747 end |
