Comparison

net/server_epoll.lua @ 8008:62ed3795be13

net.server_epoll: Attempt to simplify state control
author Kim Alvefur <zash@zash.se>
date Mon, 27 Mar 2017 04:30:48 +0200
parent 8007:67f8954875a4
child 8091:acecf1413233
comparison
equal deleted inserted replaced
8007:67f8954875a4 8008:62ed3795be13
357 end 357 end
358 end 358 end
359 359
360 -- The write buffer has been successfully emptied 360 -- The write buffer has been successfully emptied
361 function interface:ondrain() 361 function interface:ondrain()
362 if self._toclose then 362 return self:on("drain");
363 return self:close();
364 elseif self._starttls then
365 return self:starttls();
366 else
367 return self:on("drain");
368 end
369 end 363 end
370 364
371 -- Add data to write buffer and set flag for wanting to write 365 -- Add data to write buffer and set flag for wanting to write
372 function interface:write(data) 366 function interface:write(data)
373 local buffer = self.writebuffer; 367 local buffer = self.writebuffer;
386 function interface:close() 380 function interface:close()
387 if self.writebuffer and self.writebuffer[1] then 381 if self.writebuffer and self.writebuffer[1] then
388 self:setflags(false, true); -- Flush final buffer contents 382 self:setflags(false, true); -- Flush final buffer contents
389 self.write, self.send = noop, noop; -- No more writing 383 self.write, self.send = noop, noop; -- No more writing
390 log("debug", "Close %s after writing", tostring(self)); 384 log("debug", "Close %s after writing", tostring(self));
391 self._toclose = true; 385 self.ondrain = interface.close;
392 else 386 else
393 log("debug", "Close %s now", tostring(self)); 387 log("debug", "Close %s now", tostring(self));
394 self.write, self.send = noop, noop; 388 self.write, self.send = noop, noop;
395 self.close = noop; 389 self.close = noop;
396 self:on("disconnect"); 390 self:on("disconnect");
417 411
418 function interface:starttls(ctx) 412 function interface:starttls(ctx)
419 if ctx then self.tls = ctx; end 413 if ctx then self.tls = ctx; end
420 if self.writebuffer and self.writebuffer[1] then 414 if self.writebuffer and self.writebuffer[1] then
421 log("debug", "Start TLS on %s after write", tostring(self)); 415 log("debug", "Start TLS on %s after write", tostring(self));
422 self._starttls = true; 416 self.ondrain = interface.starttls;
417 self.starttls = false;
423 self:setflags(nil, true); -- make sure wantwrite is set 418 self:setflags(nil, true); -- make sure wantwrite is set
424 else 419 else
425 log("debug", "Start TLS on %s now", tostring(self)); 420 log("debug", "Start TLS on %s now", tostring(self));
426 self:setflags(false, false); 421 self:setflags(false, false);
427 local conn, err = luasec.wrap(self.conn, ctx or self.tls); 422 local conn, err = luasec.wrap(self.conn, ctx or self.tls);
430 self:destroy(); 425 self:destroy();
431 return conn, err; 426 return conn, err;
432 end 427 end
433 conn:settimeout(0); 428 conn:settimeout(0);
434 self.conn = conn; 429 self.conn = conn;
435 self._starttls = nil; 430 self.ondrain = nil;
436 self.onwriteable = interface.tlshandskake; 431 self.onwriteable = interface.tlshandskake;
437 self.onreadable = interface.tlshandskake; 432 self.onreadable = interface.tlshandskake;
438 self:setflags(true, true); 433 self:setflags(true, true);
439 self:setwritetimeout(cfg.handshake_timeout); 434 self:setwritetimeout(cfg.handshake_timeout);
440 end 435 end
446 local ok, err = self.conn:dohandshake(); 441 local ok, err = self.conn:dohandshake();
447 if ok then 442 if ok then
448 log("debug", "TLS handshake on %s complete", tostring(self)); 443 log("debug", "TLS handshake on %s complete", tostring(self));
449 self.onwriteable = nil; 444 self.onwriteable = nil;
450 self.onreadable = nil; 445 self.onreadable = nil;
451 self:setflags(true, true);
452 local old = self._tls;
453 self._tls = true; 446 self._tls = true;
454 self.starttls = false; 447 self:on("status", "ssl-handshake-complete");
455 if old == false then 448 self:init();
456 self:init();
457 else
458 self:setflags(true, true);
459 self:on("status", "ssl-handshake-complete");
460 end
461 elseif err == "wantread" then 449 elseif err == "wantread" then
462 log("debug", "TLS handshake on %s to wait until readable", tostring(self)); 450 log("debug", "TLS handshake on %s to wait until readable", tostring(self));
463 self:setflags(true, false); 451 self:setflags(true, false);
464 self:setreadtimeout(cfg.handshake_timeout); 452 self:setreadtimeout(cfg.handshake_timeout);
465 elseif err == "wantwrite" then 453 elseif err == "wantwrite" then
509 end 497 end
510 498
511 -- Initialization 499 -- Initialization
512 function interface:init() 500 function interface:init()
513 if self.tls and not self._tls then 501 if self.tls and not self._tls then
514 self._tls = false; -- This means we should call onconnect when TLS is up
515 return self:starttls(); 502 return self:starttls();
516 else 503 else
517 self.onwriteable = interface.onconnect; 504 self.onwriteable = interface.onconnect;
518 self:setwritetimeout(); 505 self:setwritetimeout();
519 return self:setflags(false, true); 506 return self:setflags(false, true);
544 end); 531 end);
545 end 532 end
546 533
547 -- Connected! 534 -- Connected!
548 function interface:onconnect() 535 function interface:onconnect()
536 if not self._connected then
537 self._connected = true;
538 self:on("connect");
539 end
549 self.onwriteable = nil; 540 self.onwriteable = nil;
550 self:on("connect"); 541 self:setflags(true, false);
551 self:setflags(true);
552 return self:onwriteable(); 542 return self:onwriteable();
553 end 543 end
554 544
555 local function addserver(addr, port, listeners, pattern, tls) 545 local function addserver(addr, port, listeners, pattern, tls)
556 local conn, err = socket.bind(addr, port, cfg.tcp_backlog); 546 local conn, err = socket.bind(addr, port, cfg.tcp_backlog);