diff options
author | Eric Wong <bofh@yhbt.net> | 2023-09-05 11:46:45 +0000 |
---|---|---|
committer | Eric Wong <bofh@yhbt.net> | 2023-09-10 20:11:54 +0000 |
commit | d08f1f34c0e80f36eebe2be04a8a2483be41d14a (patch) | |
tree | d44b4d2fd2c215b85b44ed2b8058c0f0260772f9 /lib/raindrops/aggregate/last_data_recv.rb | |
parent | 068a1f4ceeb77209503daad564735e354fd52445 (diff) | |
download | raindrops-d08f1f34c0e80f36eebe2be04a8a2483be41d14a.tar.gz |
Socket#accept and Socket#accept_nonblock return an Addrinfo object in addition to a client socket. This allows web servers to avoid having to make getpeername(2) syscalls to get the same information.
Diffstat (limited to 'lib/raindrops/aggregate/last_data_recv.rb')
-rw-r--r-- | lib/raindrops/aggregate/last_data_recv.rb | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/raindrops/aggregate/last_data_recv.rb b/lib/raindrops/aggregate/last_data_recv.rb index 6919fbc..32908f2 100644 --- a/lib/raindrops/aggregate/last_data_recv.rb +++ b/lib/raindrops/aggregate/last_data_recv.rb @@ -10,6 +10,8 @@ require "socket" # Methods wrapped include: # - TCPServer#accept # - TCPServer#accept_nonblock +# - Socket#accept +# - Socket#accept_nonblock # - Kgio::TCPServer#kgio_accept # - Kgio::TCPServer#kgio_tryaccept module Raindrops::Aggregate::LastDataRecv @@ -33,8 +35,10 @@ module Raindrops::Aggregate::LastDataRecv # automatically extends any TCPServer objects used by Unicorn def self.cornify! - Unicorn::HttpServer::LISTENERS.each do |sock| - sock.extend(self) if TCPServer === sock + Unicorn::HttpServer::LISTENERS.each do |s| + if TCPServer === s || (s.instance_of?(Socket) && s.local_address.ip?) + s.extend(self) + end end end @@ -60,8 +64,8 @@ module Raindrops::Aggregate::LastDataRecv count! super end - def accept_nonblock - count! super + def accept_nonblock(exception: true) + count! super(exception: exception) end # :startdoc: @@ -72,12 +76,19 @@ module Raindrops::Aggregate::LastDataRecv # # We require TCP_DEFER_ACCEPT on the listen socket for # +last_data_recv+ to be accurate - def count!(io) + def count!(ret) + case ret + when :wait_readable + when Array # Socket#accept_nonblock + io = ret[0] + else # TCPSocket#accept_nonblock + io = ret + end if io x = Raindrops::TCP_Info.new(io) @raindrops_aggregate << x.last_data_recv end - io + ret end end |