From 96544b63f406ec5fb158a523bf7227f1dfe9bea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Mon, 16 Apr 2018 19:09:45 +0000 Subject: [PATCH] Add HTTP::Server.listening? and raise errors when running or closed --- spec/std/http/server/server_spec.cr | 52 +++++++++++++++++++++++++++++ src/http/server.cr | 12 ++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/spec/std/http/server/server_spec.cr b/spec/std/http/server/server_spec.cr index b035841502aa..6385bc653817 100644 --- a/spec/std/http/server/server_spec.cr +++ b/spec/std/http/server/server_spec.cr @@ -258,6 +258,58 @@ module HTTP server.addresses.should eq addresses end + + describe "#bind" do + it "fails after listen" do + server = Server.new {} + server.bind_unused_port + spawn { server.listen } + Fiber.yield + expect_raises(Exception, "Can't add socket to running server.") do + server.bind_unused_port + end + server.close + end + + it "fails after close" do + server = Server.new {} + server.bind_unused_port + spawn { server.listen } + Fiber.yield + server.close + expect_raises(Exception, "Can't add socket to closed server.") do + server.bind_unused_port + end + server.close + end + end + + describe "#listen" do + it "fails after listen" do + server = Server.new {} + server.bind_unused_port + spawn { server.listen } + Fiber.yield + server.listening?.should be_true + expect_raises(Exception, "Can't start running server.") do + server.listen + end + server.close + end + + it "fails after close" do + server = Server.new {} + server.bind_unused_port + spawn { server.listen } + Fiber.yield + server.listening?.should be_true + server.close + server.listening?.should be_false + expect_raises(Exception, "Can't re-start closed server.") do + server.listen + end + end + end end describe HTTP::Server::RequestProcessor do diff --git a/src/http/server.cr b/src/http/server.cr index e5b7bcbb23df..bd63247e1ffb 100644 --- a/src/http/server.cr +++ b/src/http/server.cr @@ -102,6 +102,9 @@ class HTTP::Server @wants_close = false @sockets = [] of Socket::Server + # Returns `true` if this server is listening on it's sockets. + getter? listening : Bool = false + # Creates a new HTTP server with the given block as handler. def self.new(&handler : HTTP::Handler::Proc) : self new(handler) @@ -159,6 +162,9 @@ class HTTP::Server # Adds a `Socket::Server` *socket* to this server. def bind(socket : Socket::Server) : Nil + raise "Can't add socket to running server." if listening? + raise "Can't add socket to closed server." if @wants_close + @sockets << socket end @@ -199,8 +205,11 @@ class HTTP::Server # Starts the server. Blocks until the server is closed. def listen - raise "Can't start server with not sockets to listen to" if @sockets.empty? + raise "Can't re-start closed server." if @wants_close + raise "Can't start server with no sockets to listen to. Use HTTP::Server#bind first." if @sockets.empty? + raise "Can't start running server." if listening? + @listening = true done = Channel(Nil).new @sockets.each do |socket| @@ -228,6 +237,7 @@ class HTTP::Server # ignore exception on close end + @listening = false @sockets.clear end