aboutsummaryrefslogtreecommitdiffstats
path: root/lib/plum
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-10-23 09:59:39 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-10-23 09:59:39 +0900
commitb6de76aa184bae4637fa4c1beb6bf296d97c7679 (patch)
treee6a1ed4d8bb2a2a6788c7c90cd9c5ddd9d6c74d6 /lib/plum
parent8aae57e6a3ea2d2367e9b4a82aa3af46c9f05720 (diff)
downloadplum-b6de76aa184bae4637fa4c1beb6bf296d97c7679.tar.gz
set start_immediately=false for SSLServer
Diffstat (limited to 'lib/plum')
-rw-r--r--lib/plum/rack/connection.rb46
-rw-r--r--lib/plum/rack/listener.rb30
-rw-r--r--lib/plum/rack/server.rb19
3 files changed, 46 insertions, 49 deletions
diff --git a/lib/plum/rack/connection.rb b/lib/plum/rack/connection.rb
index 23314bd..52e7117 100644
--- a/lib/plum/rack/connection.rb
+++ b/lib/plum/rack/connection.rb
@@ -1,37 +1,35 @@
module Plum
module Rack
class Connection
- attr_reader :app, :listener, :plum
+ attr_reader :app, :sock, :plum
- def initialize(app, listener, logger)
+ def initialize(app, plum, logger)
@app = app
- @listener = listener
+ @plum = plum
@logger = logger
+
+ setup_plum
end
def stop
- @listener.close # TODO: gracefully shutdown
+ @plum.stop
end
- def start
- Thread.new {
- begin
- @plum = setup_plum
- @plum.run
- rescue Errno::EPIPE, Errno::ECONNRESET => e
- @logger.debug("connection closed: #{e}")
- rescue StandardError => e
- @logger.error("#{e.class}: #{e.message}\n#{e.backtrace.map { |b| "\t#{b}" }.join("\n")}")
- end
- }
+ def run
+ begin
+ @plum.run
+ rescue Errno::EPIPE, Errno::ECONNRESET => e
+ @logger.debug("connection closed: #{e}")
+ rescue StandardError => e
+ @logger.error("#{e.class}: #{e.message}\n#{e.backtrace.map { |b| "\t#{b}" }.join("\n")}")
+ end
end
private
def setup_plum
- plum = @listener.plum
- plum.on(:connection_error) { |ex| @logger.error(ex) }
+ @plum.on(:connection_error) { |ex| @logger.error(ex) }
- plum.on(:stream) do |stream|
+ @plum.on(:stream) do |stream|
stream.on(:stream_error) { |ex| @logger.error(ex) }
headers = data = nil
@@ -56,17 +54,19 @@ module Plum
if r_body.is_a?(::Rack::BodyProxy)
stream.respond(r_headers, end_stream: false)
- r_body.each { |part|
- stream.send_data(part, end_stream: false)
- }
+ begin
+ r_body.each { |part|
+ stream.send_data(part, end_stream: false)
+ }
+ ensure
+ r_body.close
+ end
stream.send_data(nil)
else
stream.respond(r_headers, r_body)
end
}
end
-
- plum
end
def new_env(h, data)
diff --git a/lib/plum/rack/listener.rb b/lib/plum/rack/listener.rb
index d39aad1..87d6179 100644
--- a/lib/plum/rack/listener.rb
+++ b/lib/plum/rack/listener.rb
@@ -9,17 +9,8 @@ module Plum
raise "not implemented"
end
- def accept
- @sock = to_io.accept
- self
- end
-
def method_missing(name, *args)
- if @sock
- @sock.__send__(name, *args)
- else
- @server.__send__(name, *args)
- end
+ @server.__send__(name, *args)
end
end
@@ -32,8 +23,8 @@ module Plum
@server.to_io
end
- def plum
- ::Plum::HTTPConnection.new(self)
+ def plum(sock)
+ ::Plum::HTTPConnection.new(sock)
end
end
@@ -56,20 +47,15 @@ module Plum
ctx.key = OpenSSL::PKey::RSA.new(key)
tcp_server = ::TCPServer.new(lc[:hostname], lc[:port])
@server = OpenSSL::SSL::SSLServer.new(tcp_server, ctx)
- @server.start_immediately = true # TODO
+ @server.start_immediately = false
end
def to_io
@server.to_io
end
- def accept
- @sock = @server.accept
- self
- end
-
- def plum
- ::Plum::HTTPSConnection.new(self)
+ def plum(sock)
+ ::Plum::HTTPSConnection.new(sock)
end
private
@@ -111,8 +97,8 @@ module Plum
@server.to_io
end
- def plum
- ::Plum::HTTPConnection.new(self)
+ def plum(sock)
+ ::Plum::HTTPSConnection.new(sock)
end
end
end
diff --git a/lib/plum/rack/server.rb b/lib/plum/rack/server.rb
index 15cb10a..2a72d6e 100644
--- a/lib/plum/rack/server.rb
+++ b/lib/plum/rack/server.rb
@@ -36,17 +36,28 @@ module Plum
def stop
@state = :stop
@listeners.map(&:stop)
+ # TODO: gracefully shutdown connections
end
private
def new_con(svr)
sock = svr.accept
- @logger.debug("accept: #{sock}")
+ Thread.new {
+ begin
+ sock = sock.accept if sock.respond_to?(:accept)
+ plum = svr.plum(sock)
+ @logger.debug("accept: #{plum}")
- con = Connection.new(@app, sock, @logger)
- con.start
+ con = Connection.new(@app, plum, @logger)
+ con.run
+ rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINVAL => e # closed
+ sock.close if sock
+ rescue StandardError => e
+ @logger.error("#{e.class}: #{e.message}\n#{e.backtrace.map { |b| "\t#{b}" }.join("\n")}")
+ sock.close if sock
+ end
+ }
rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINVAL => e # closed
- @logger.debug("connection closed while accepting: #{e}")
rescue StandardError => e
@logger.error("#{e.class}: #{e.message}\n#{e.backtrace.map { |b| "\t#{b}" }.join("\n")}")
end