aboutsummaryrefslogtreecommitdiffstats
path: root/lib/plum/rack/listener.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/plum/rack/listener.rb')
-rw-r--r--lib/plum/rack/listener.rb65
1 files changed, 57 insertions, 8 deletions
diff --git a/lib/plum/rack/listener.rb b/lib/plum/rack/listener.rb
index 3ff6c4a..8af12be 100644
--- a/lib/plum/rack/listener.rb
+++ b/lib/plum/rack/listener.rb
@@ -10,6 +10,10 @@ module Plum
raise "not implemented"
end
+ def accept(svc)
+ raise "not implemented"
+ end
+
def method_missing(name, *args)
@server.__send__(name, *args)
end
@@ -24,8 +28,24 @@ module Plum
@server.to_io
end
- def plum(sock)
- ::Plum::HTTPServerConnection.new(sock.method(:write))
+ def accept(svc)
+ sock = @server.accept
+ Thread.start {
+ begin
+ plum = ::Plum::HTTPServerConnection.new(sock.method(:write))
+ sess = Session.new(svc, sock, plum)
+ sess.run
+ rescue Errno::ECONNRESET, EOFError # closed
+ rescue ::Plum::LegacyHTTPError => e
+ @logger.info "legacy HTTP client: #{e}"
+ sess = LegacySession.new(svc, e, sock)
+ sess.run
+ rescue => e
+ svc.log_exception(e)
+ ensure
+ sock.close
+ end
+ }
end
end
@@ -57,7 +77,7 @@ module Plum
}
tcp_server = ::TCPServer.new(lc[:hostname], lc[:port])
@server = OpenSSL::SSL::SSLServer.new(tcp_server, ctx)
- @server.start_immediately = false
+ @server.start_immediately = false # call socket#accept twice: [tcp, tls]
end
def parse_chained_cert(str)
@@ -68,9 +88,26 @@ module Plum
@server.to_io
end
- def plum(sock)
- raise ::Plum::LegacyHTTPError.new("client didn't offer h2 with ALPN", nil) unless sock.alpn_protocol == "h2"
- ::Plum::ServerConnection.new(sock.method(:write))
+ def accept(svc)
+ sock = @server.accept
+ Thread.start {
+ begin
+ sock = sock.accept
+ raise ::Plum::LegacyHTTPError.new("client didn't offer h2 with ALPN", nil) unless sock.alpn_protocol == "h2"
+ plum = ::Plum::ServerConnection.new(sock.method(:write))
+ sess = Session.new(svc, sock, plum)
+ sess.run
+ rescue Errno::ECONNRESET, EOFError # closed
+ rescue ::Plum::LegacyHTTPError => e
+ @logger.info "legacy HTTP client: #{e}"
+ sess = LegacySession.new(svc, e, sock)
+ sess.run
+ rescue => e
+ svc.log_exception(e)
+ ensure
+ sock.close if sock
+ end
+ }
end
private
@@ -126,8 +163,20 @@ module Plum
@server.to_io
end
- def plum(sock)
- ::Plum::ServerConnection.new(sock.method(:write))
+ def accept(svc)
+ sock = @server.accept
+ Thread.start {
+ begin
+ plum = ::Plum::ServerConnection.new(sock.method(:write))
+ sess = Session.new(svc, sock, plum)
+ sess.run
+ rescue Errno::ECONNRESET, EOFError # closed
+ rescue => e
+ svc.log_exception(e)
+ ensure
+ sock.close if sock
+ end
+ }
end
end
end