Mercurial > prosody-hg
comparison net/server_event.lua @ 7338:f8d37227acd7
Merge 0.10->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 05 Apr 2016 20:54:43 +0200 |
| parents | a74f0b7be6bf 8ec935687bae |
| children | aa94cd27df4d |
comparison
equal
deleted
inserted
replaced
| 7335:ab7e7d4fe9c1 | 7338:f8d37227acd7 |
|---|---|
| 255 return self:_lock(self.nointerface, true, self.nowriting); | 255 return self:_lock(self.nointerface, true, self.nowriting); |
| 256 end | 256 end |
| 257 | 257 |
| 258 function interface_mt:resume() | 258 function interface_mt:resume() |
| 259 self:_lock(self.nointerface, false, self.nowriting); | 259 self:_lock(self.nointerface, false, self.nowriting); |
| 260 if self.readcallback and not self.eventread then | 260 if self.readcallback and not self.eventread then |
| 261 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback | 261 self.eventread = addevent( base, self.conn, EV_READ, self.readcallback, cfg.READ_TIMEOUT ); -- register callback |
| 262 return true; | 262 return true; |
| 263 end | 263 end |
| 264 end | 264 end |
| 265 | 265 |
| 266 function interface_mt:counter(c) | 266 function interface_mt:counter(c) |
| 267 if c then | 267 if c then |
| 389 return -1 | 389 return -1 |
| 390 end | 390 end |
| 391 if not self.eventwrite then | 391 if not self.eventwrite then |
| 392 self:_lock( true, true, true ) -- lock the interface, to not disturb the handshake | 392 self:_lock( true, true, true ) -- lock the interface, to not disturb the handshake |
| 393 self.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, self.startsslcallback, 0 ) -- add event to start handshake | 393 self.eventstarthandshake = addevent( base, nil, EV_TIMEOUT, self.startsslcallback, 0 ) -- add event to start handshake |
| 394 else -- wait until writebuffer is empty | 394 else |
| 395 -- wait until writebuffer is empty | |
| 395 self:_lock( true, true, false ) | 396 self:_lock( true, true, false ) |
| 396 debug "ssl session delayed until writebuffer is empty..." | 397 debug "ssl session delayed until writebuffer is empty..." |
| 397 end | 398 end |
| 398 self.starttls = false; | 399 self.starttls = false; |
| 399 return true | 400 return true |
| 406 return false, "setoption not implemented"; | 407 return false, "setoption not implemented"; |
| 407 end | 408 end |
| 408 | 409 |
| 409 function interface_mt:setlistener(listener) | 410 function interface_mt:setlistener(listener) |
| 410 self:ondetach(); -- Notify listener that it is no longer responsible for this connection | 411 self:ondetach(); -- Notify listener that it is no longer responsible for this connection |
| 411 self.onconnect, self.ondisconnect, self.onincoming, self.ontimeout, | 412 self.onconnect = listener.onconnect; |
| 412 self.onreadtimeout, self.onstatus, self.ondetach | 413 self.ondisconnect = listener.ondisconnect; |
| 413 = listener.onconnect, listener.ondisconnect, listener.onincoming, listener.ontimeout, | 414 self.onincoming = listener.onincoming; |
| 414 listener.onreadtimeout, listener.onstatus, listener.ondetach; | 415 self.ontimeout = listener.ontimeout; |
| 416 self.onreadtimeout = listener.onreadtimeout; | |
| 417 self.onstatus = listener.onstatus; | |
| 418 self.ondetach = listener.ondetach; | |
| 415 end | 419 end |
| 416 | 420 |
| 417 -- Stub handlers | 421 -- Stub handlers |
| 418 function interface_mt:onconnect() | 422 function interface_mt:onconnect() |
| 419 end | 423 end |
| 579 if "wantwrite" == err then -- need to read on write event | 583 if "wantwrite" == err then -- need to read on write event |
| 580 if not interface.eventwrite then -- register new write event if needed | 584 if not interface.eventwrite then -- register new write event if needed |
| 581 interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT ) | 585 interface.eventwrite = addevent( base, interface.conn, EV_WRITE, interface.writecallback, cfg.WRITE_TIMEOUT ) |
| 582 end | 586 end |
| 583 interface.eventreadtimeout = addevent( base, nil, EV_TIMEOUT, | 587 interface.eventreadtimeout = addevent( base, nil, EV_TIMEOUT, |
| 584 function( ) | 588 function( ) |
| 585 interface:_close() | 589 interface:_close() |
| 586 end, cfg.READ_TIMEOUT | 590 end, cfg.READ_TIMEOUT |
| 587 ) | 591 ) |
| 588 debug( "wantwrite during read attempt, reg it in writecallback but dont know what really happens next..." ) | 592 debug( "wantwrite during read attempt, reg it in writecallback but dont know what really happens next..." ) |
| 589 -- to be honest i dont know what happens next, if it is allowed to first read, the write etc... | 593 -- to be honest i dont know what happens next, if it is allowed to first read, the write etc... |
| 590 else -- connection was closed or fatal error | 594 else -- connection was closed or fatal error |
| 591 interface.fatalerror = err | 595 interface.fatalerror = err |
| 701 local function addclient( addr, serverport, listener, pattern, sslctx, typ ) | 705 local function addclient( addr, serverport, listener, pattern, sslctx, typ ) |
| 702 if sslctx and not has_luasec then | 706 if sslctx and not has_luasec then |
| 703 debug "need luasec, but not available" | 707 debug "need luasec, but not available" |
| 704 return nil, "luasec not found" | 708 return nil, "luasec not found" |
| 705 end | 709 end |
| 706 if getaddrinfo and not typ then | 710 if not typ then |
| 707 local addrinfo, err = getaddrinfo(addr) | 711 local addrinfo, err = getaddrinfo(addr) |
| 708 if not addrinfo then return nil, err end | 712 if not addrinfo then return nil, err end |
| 709 if addrinfo[1] and addrinfo[1].family == "inet6" then | 713 if addrinfo[1] and addrinfo[1].family == "inet6" then |
| 710 typ = "tcp6" | 714 typ = "tcp6" |
| 711 end | 715 else |
| 712 end | 716 typ = "tcp" |
| 713 local create = socket[typ or "tcp"] | 717 end |
| 718 end | |
| 719 local create = socket[typ] | |
| 714 if type( create ) ~= "function" then | 720 if type( create ) ~= "function" then |
| 715 return nil, "invalid socket type" | 721 return nil, "invalid socket type" |
| 716 end | 722 end |
| 717 local client, err = create() -- creating new socket | 723 local client, err = create() -- creating new socket |
| 718 if not client then | 724 if not client then |
| 719 debug( "cannot create socket:", err ) | 725 debug( "cannot create socket:", err ) |
| 720 return nil, err | 726 return nil, err |
| 721 end | 727 end |
| 722 client:settimeout( 0 ) -- set nonblocking | 728 client:settimeout( 0 ) -- set nonblocking |
| 723 local res, err = client:connect( addr, serverport ) -- connect | 729 local res, err = client:connect( addr, serverport ) -- connect |
| 724 if res or ( err == "timeout" or err == "Operation already in progress" ) then | 730 if res or ( err == "timeout" ) then |
| 725 if client.getsockname then | 731 local ip, port = client:getsockname( ) |
| 726 addr = client:getsockname( ) | 732 local interface = wrapclient( client, ip, serverport, listener, pattern, sslctx ) |
| 727 end | 733 interface:_start_connection( sslctx ) |
| 728 local interface = wrapclient( client, addr, serverport, listener, pattern, sslctx ) | |
| 729 debug( "new connection id:", interface.id ) | 734 debug( "new connection id:", interface.id ) |
| 730 return interface, err | 735 return interface, err |
| 731 else | 736 else |
| 732 debug( "new connection failed:", err ) | 737 debug( "new connection failed:", err ) |
| 733 return nil, err | 738 return nil, err |
