Comparison

net/server_event.lua @ 12480:7e9ebdc75ce4

net: isolate LuaSec-specifics For this, various accessor functions are now provided directly on the sockets, which reach down into the LuaSec implementation to obtain the information. While this may seem of little gain at first, it hides the implementation detail of the LuaSec+LuaSocket combination that the actual socket and the TLS layer are separate objects. The net gain here is that an alternative implementation does not have to emulate that specific implementation detail and "only" has to expose LuaSec-compatible data structures on the new functions.
author Jonas Schäfer <jonas@wielicki.name>
date Wed, 27 Apr 2022 17:44:14 +0200
parent 12387:05c250fa335a
child 12481:2ee27587fec7
comparison
equal deleted inserted replaced
12478:82270a6b1234 12480:7e9ebdc75ce4
45 local s_sub = string.sub 45 local s_sub = string.sub
46 46
47 local coroutine_wrap = coroutine.wrap 47 local coroutine_wrap = coroutine.wrap
48 local coroutine_yield = coroutine.yield 48 local coroutine_yield = coroutine.yield
49 49
50 local has_luasec, ssl = pcall ( require , "ssl" ) 50 local has_luasec = pcall ( require , "ssl" )
51 local socket = require "socket" 51 local socket = require "socket"
52 local levent = require "luaevent.core" 52 local levent = require "luaevent.core"
53 local inet = require "util.net"; 53 local inet = require "util.net";
54 local inet_pton = inet.pton; 54 local inet_pton = inet.pton;
55 55
151 local _ 151 local _
152 _ = self.eventread and self.eventread:close( ) -- close events; this must be called outside of the event callbacks! 152 _ = self.eventread and self.eventread:close( ) -- close events; this must be called outside of the event callbacks!
153 _ = self.eventwrite and self.eventwrite:close( ) 153 _ = self.eventwrite and self.eventwrite:close( )
154 self.eventread, self.eventwrite = nil, nil 154 self.eventread, self.eventwrite = nil, nil
155 local err 155 local err
156 self.conn, err = ssl.wrap( self.conn, self._sslctx ) 156 self.conn, err = self._sslctx:wrap(self.conn)
157 if err then 157 if err then
158 self.fatalerror = err 158 self.fatalerror = err
159 self.conn = nil -- cannot be used anymore 159 self.conn = nil -- cannot be used anymore
160 if call_onconnect then 160 if call_onconnect then
161 self.ondisconnect = nil -- don't call this when client isn't really connected 161 self.ondisconnect = nil -- don't call this when client isn't really connected
166 end 166 end
167 167
168 if self.conn.sni then 168 if self.conn.sni then
169 if self.servername then 169 if self.servername then
170 self.conn:sni(self.servername); 170 self.conn:sni(self.servername);
171 elseif self._server and type(self._server.hosts) == "table" and next(self._server.hosts) ~= nil then 171 elseif next(self._sslctx._sni_contexts) ~= nil then
172 self.conn:sni(self._server.hosts, true); 172 self.conn:sni(self._sslctx._sni_contexts, true);
173 end 173 end
174 end 174 end
175 175
176 self.conn:settimeout( 0 ) -- set non blocking 176 self.conn:settimeout( 0 ) -- set non blocking
177 local handshakecallback = coroutine_wrap(function( event ) 177 local handshakecallback = coroutine_wrap(function( event )
270 end 270 end
271 end 271 end
272 272
273 function interface_mt:pause() 273 function interface_mt:pause()
274 return self:_lock(self.nointerface, true, self.nowriting); 274 return self:_lock(self.nointerface, true, self.nowriting);
275 end
276
277 function interface_mt:sslctx()
278 return self._sslctx
279 end
280
281 function interface_mt:ssl_info()
282 return self.conn.info and self.conn:info()
283 end
284
285 function interface_mt:ssl_peercertificate()
286 return self.conn.getpeercertificate and self.conn:getpeercertificate()
287 end
288
289 function interface_mt:ssl_peerverification()
290 return self.conn.getpeerverification and self.conn:getpeerverification()
291 end
292
293 function interface_mt:ssl_peerfinished()
294 return self.conn.getpeerfinished and self.conn:getpeerfinished()
275 end 295 end
276 296
277 function interface_mt:resume() 297 function interface_mt:resume()
278 self:_lock(self.nointerface, false, self.nowriting); 298 self:_lock(self.nointerface, false, self.nowriting);
279 if self.readcallback and not self.eventread then 299 if self.readcallback and not self.eventread then