Mercurial > prosody-hg
comparison net/server_epoll.lua @ 11063:30d3f6f85eb8 0.11
net.server: Backport client parts of SNI support from trunk (#409)
Partial backports of the following commits from trunk:
6c804b6b2ca2 net.http: Pass server name along for SNI (fixes #1408)
75d2874502c3 net.server_select: SNI support (#409)
9a905888b96c net.server_event: Add SNI support (#409)
adc0672b700e net.server_epoll: Add support for SNI (#409)
d4390c427a66 net.server: Handle server name (SNI) as extra argument
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 17 Aug 2020 23:01:14 +0200 |
| parents | e531273341d3 |
| children | 988ddd57e851 2c559953ad41 |
comparison
equal
deleted
inserted
replaced
| 11061:45e1c467a3a7 | 11063:30d3f6f85eb8 |
|---|---|
| 481 self:destroy(); | 481 self:destroy(); |
| 482 return conn, err; | 482 return conn, err; |
| 483 end | 483 end |
| 484 conn:settimeout(0); | 484 conn:settimeout(0); |
| 485 self.conn = conn; | 485 self.conn = conn; |
| 486 if conn.sni and self.servername then | |
| 487 conn:sni(self.servername); | |
| 488 end | |
| 486 self:on("starttls"); | 489 self:on("starttls"); |
| 487 self.ondrain = nil; | 490 self.ondrain = nil; |
| 488 self.onwritable = interface.tlshandskake; | 491 self.onwritable = interface.tlshandskake; |
| 489 self.onreadable = interface.tlshandskake; | 492 self.onreadable = interface.tlshandskake; |
| 490 return self:init(); | 493 return self:init(); |
| 510 self:on("disconnect", err); | 513 self:on("disconnect", err); |
| 511 self:destroy(); | 514 self:destroy(); |
| 512 end | 515 end |
| 513 end | 516 end |
| 514 | 517 |
| 515 local function wrapsocket(client, server, read_size, listeners, tls_ctx) -- luasocket object -> interface object | 518 local function wrapsocket(client, server, read_size, listeners, tls_ctx, extra) -- luasocket object -> interface object |
| 516 client:settimeout(0); | 519 client:settimeout(0); |
| 517 local conn = setmetatable({ | 520 local conn = setmetatable({ |
| 518 conn = client; | 521 conn = client; |
| 519 _server = server; | 522 _server = server; |
| 520 created = gettime(); | 523 created = gettime(); |
| 521 listeners = listeners; | 524 listeners = listeners; |
| 522 read_size = read_size or (server and server.read_size); | 525 read_size = read_size or (server and server.read_size); |
| 523 writebuffer = {}; | 526 writebuffer = {}; |
| 524 tls_ctx = tls_ctx or (server and server.tls_ctx); | 527 tls_ctx = tls_ctx or (server and server.tls_ctx); |
| 525 tls_direct = server and server.tls_direct; | 528 tls_direct = server and server.tls_direct; |
| 529 extra = extra; | |
| 526 }, interface_mt); | 530 }, interface_mt); |
| 531 | |
| 532 if extra then | |
| 533 if extra.servername then | |
| 534 conn.servername = extra.servername; | |
| 535 end | |
| 536 end | |
| 527 | 537 |
| 528 conn:updatenames(); | 538 conn:updatenames(); |
| 529 return conn; | 539 return conn; |
| 530 end | 540 end |
| 531 | 541 |
| 615 server:add(true, false); | 625 server:add(true, false); |
| 616 return server; | 626 return server; |
| 617 end | 627 end |
| 618 | 628 |
| 619 -- COMPAT | 629 -- COMPAT |
| 620 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx) | 630 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx, extra) |
| 621 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx); | 631 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra); |
| 622 if not client.peername then | 632 if not client.peername then |
| 623 client.peername, client.peerport = addr, port; | 633 client.peername, client.peerport = addr, port; |
| 624 end | 634 end |
| 625 local ok, err = client:init(); | 635 local ok, err = client:init(); |
| 626 if not ok then return ok, err; end | 636 if not ok then return ok, err; end |
| 629 end | 639 end |
| 630 return client; | 640 return client; |
| 631 end | 641 end |
| 632 | 642 |
| 633 -- New outgoing TCP connection | 643 -- New outgoing TCP connection |
| 634 local function addclient(addr, port, listeners, read_size, tls_ctx, typ) | 644 local function addclient(addr, port, listeners, read_size, tls_ctx, typ, extra) |
| 635 local create; | 645 local create; |
| 636 if not typ then | 646 if not typ then |
| 637 local n = inet_pton(addr); | 647 local n = inet_pton(addr); |
| 638 if not n then return nil, "invalid-ip"; end | 648 if not n then return nil, "invalid-ip"; end |
| 639 if #n == 16 then | 649 if #n == 16 then |
| 651 local conn, err = create(); | 661 local conn, err = create(); |
| 652 local ok, err = conn:settimeout(0); | 662 local ok, err = conn:settimeout(0); |
| 653 if not ok then return ok, err; end | 663 if not ok then return ok, err; end |
| 654 local ok, err = conn:setpeername(addr, port); | 664 local ok, err = conn:setpeername(addr, port); |
| 655 if not ok and err ~= "timeout" then return ok, err; end | 665 if not ok and err ~= "timeout" then return ok, err; end |
| 656 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx) | 666 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx, extra) |
| 657 local ok, err = client:init(); | 667 local ok, err = client:init(); |
| 658 if not ok then return ok, err; end | 668 if not ok then return ok, err; end |
| 659 if tls_ctx then | 669 if tls_ctx then |
| 660 client:starttls(tls_ctx); | 670 client:starttls(tls_ctx); |
| 661 end | 671 end |
