Skip to content

Commit

Permalink
Add HTTP::Server.listening? and raise errors when running or closed
Browse files Browse the repository at this point in the history
  • Loading branch information
straight-shoota committed Apr 16, 2018
1 parent 8a91ee0 commit 96544b6
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 1 deletion.
52 changes: 52 additions & 0 deletions spec/std/http/server/server_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 11 additions & 1 deletion src/http/server.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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|
Expand Down Expand Up @@ -228,6 +237,7 @@ class HTTP::Server
# ignore exception on close
end

@listening = false
@sockets.clear
end

Expand Down

0 comments on commit 96544b6

Please sign in to comment.