about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <bofh@yhbt.net>2023-09-05 11:46:45 +0000
committerEric Wong <bofh@yhbt.net>2023-09-10 20:11:54 +0000
commitd08f1f34c0e80f36eebe2be04a8a2483be41d14a (patch)
treed44b4d2fd2c215b85b44ed2b8058c0f0260772f9 /lib
parent068a1f4ceeb77209503daad564735e354fd52445 (diff)
downloadraindrops-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')
-rw-r--r--lib/raindrops/aggregate/last_data_recv.rb23
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