diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-10-23 09:59:39 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-10-23 09:59:39 +0900 |
commit | b6de76aa184bae4637fa4c1beb6bf296d97c7679 (patch) | |
tree | e6a1ed4d8bb2a2a6788c7c90cd9c5ddd9d6c74d6 /lib/plum | |
parent | 8aae57e6a3ea2d2367e9b4a82aa3af46c9f05720 (diff) | |
download | plum-b6de76aa184bae4637fa4c1beb6bf296d97c7679.tar.gz |
set start_immediately=false for SSLServer
Diffstat (limited to 'lib/plum')
-rw-r--r-- | lib/plum/rack/connection.rb | 46 | ||||
-rw-r--r-- | lib/plum/rack/listener.rb | 30 | ||||
-rw-r--r-- | lib/plum/rack/server.rb | 19 |
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 |