Skip to content

Commit

Permalink
Refactor HTTP::Server to use multiple interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
straight-shoota committed Mar 6, 2018
1 parent 163c0cb commit c3635e1
Show file tree
Hide file tree
Showing 7 changed files with 154 additions and 86 deletions.
3 changes: 2 additions & 1 deletion samples/http_server.cr
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
require "http/server"

server = HTTP::Server.new "0.0.0.0", 8080 do |context|
server = HTTP::Server.new do |context|
context.response.headers["Content-Type"] = "text/plain"
context.response.print("Hello world!")
end

server.bind "0.0.0.0", 8080
puts "Listening on http://0.0.0.0:8080"
server.listen
62 changes: 45 additions & 17 deletions spec/std/http/server/server_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -195,20 +195,21 @@ module HTTP

describe HTTP::Server do
it "re-sets special port zero after bind" do
server = Server.new(0) { |ctx| }
server.bind
server = Server.new { |ctx| }
server.bind 0
server.port.should_not eq(0)
end

it "re-sets port to zero after close" do
server = Server.new(0) { |ctx| }
server.bind
it "re-sets port to nil after close" do
server = Server.new { |ctx| }
server.bind 0
server.close
server.port.should eq(0)
server.port.should be_nil
end

it "doesn't raise on accept after close #2692" do
server = Server.new("0.0.0.0", 0) { }
server = Server.new { }
server.bind "0.0.0.0", 0

spawn do
server.close
Expand All @@ -219,15 +220,36 @@ module HTTP
end

it "reuses the TCP port (SO_REUSEPORT)" do
s1 = Server.new(0) { |ctx| }
s1.bind(reuse_port: true)
s1 = Server.new { |ctx| }
s1.bind(0, reuse_port: true)

s2 = Server.new(s1.port) { |ctx| }
s2.bind(reuse_port: true)
s2 = Server.new { |ctx| }
s2.bind(s1.port.not_nil!, reuse_port: true)

s1.close
s2.close
end

it "binds to different interfaces" do
server = Server.new do |context|
context.response.print "Test Server (#{context.request.headers["Host"]?})"
end

interface1 = server.bind(0)
interface2 = server.bind(0)

port1 = interface1.local_address.port
port2 = interface2.local_address.port
port1.should_not eq port2

spawn { server.listen }

Fiber.yield

HTTP::Client.get("http://127.0.0.1:#{port2}/").body.should eq "Test Server (127.0.0.1:#{port2})"
HTTP::Client.get("http://127.0.0.1:#{port1}/").body.should eq "Test Server (127.0.0.1:#{port1})"
HTTP::Client.get("http://127.0.0.1:#{port1}/").body.should eq "Test Server (127.0.0.1:#{port1})"
end
end

describe HTTP::Server::RequestProcessor do
Expand Down Expand Up @@ -310,40 +332,46 @@ module HTTP

typeof(begin
# Initialize with custom host
server = Server.new("0.0.0.0", 0) { |ctx| }
server = Server.new { |ctx| }
server.bind "0.0.0.0", 0
server.listen
server.close

server = Server.new("0.0.0.0", 0, [
server = Server.new([
ErrorHandler.new,
LogHandler.new,
CompressHandler.new,
StaticFileHandler.new("."),
]
)
server.bind "0.0.0.0", 0
server.listen
server.close

server = Server.new("0.0.0.0", 0, [StaticFileHandler.new(".")]) { |ctx| }
server = Server.new([StaticFileHandler.new(".")]) { |ctx| }
server.bind "0.0.0.0", 0
server.listen
server.close

# Initialize with default host
server = Server.new(0) { |ctx| }
server = Server.new { |ctx| }
server.bind 0
server.listen
server.close

server = Server.new(0, [
server = Server.new([
ErrorHandler.new,
LogHandler.new,
CompressHandler.new,
StaticFileHandler.new("."),
]
)
server.bind 0
server.listen
server.close

server = Server.new(0, [StaticFileHandler.new(".")]) { |ctx| }
server = Server.new([StaticFileHandler.new(".")]) { |ctx| }
server.bind 0
server.listen
server.close
end)
Expand Down
12 changes: 6 additions & 6 deletions spec/std/http/web_socket_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,9 @@ describe HTTP::WebSocket do
end
end

http_server = http_ref = HTTP::Server.new(0, [ws_handler])
http_server.bind
port_chan.send(http_server.port)
http_server = http_ref = HTTP::Server.new([ws_handler])
http_server.bind 0
port_chan.send(http_server.port.not_nil!)
http_server.listen
end

Expand Down Expand Up @@ -350,12 +350,12 @@ describe HTTP::WebSocket do
end
end

http_server = http_ref = HTTP::Server.new(0, [ws_handler])
http_server = http_ref = HTTP::Server.new([ws_handler])
tls = http_server.tls = OpenSSL::SSL::Context::Server.new
tls.certificate_chain = File.join(__DIR__, "../openssl/ssl/openssl.crt")
tls.private_key = File.join(__DIR__, "../openssl/ssl/openssl.key")
http_server.bind
port_chan.send(http_server.port)
http_server.bind 0
port_chan.send(http_server.port.not_nil!)
http_server.listen
end

Expand Down
6 changes: 4 additions & 2 deletions src/compiler/crystal/tools/playground/server.cr
Original file line number Diff line number Diff line change
Expand Up @@ -503,11 +503,13 @@ module Crystal::Playground
HTTP::StaticFileHandler.new(public_dir),
]

server = HTTP::Server.new handlers

host = @host
if host
server = HTTP::Server.new host, @port, handlers
server.bind host, @port
else
server = HTTP::Server.new @port, handlers
server.bind @port
host = "localhost"
end

Expand Down
3 changes: 2 additions & 1 deletion src/compiler/crystal/tools/playground/views/_about.html
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,12 @@ <h1>Usage</h1>
<pre class="playground">
require "http/server"

server = HTTP::Server.new "0.0.0.0", 5678 do |context|
server = HTTP::Server.new do |context|
context.request.path
context.response.headers["Content-Type"] = "text/plain"
context.response.print("Hello world!")
end
server.bind "0.0.0.0", 5678

puts "Listening on http://0.0.0.0:5678"
server.listen</pre>
Expand Down
3 changes: 2 additions & 1 deletion src/http/formdata.cr
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ require "./formdata/**"
# require "http"
# require "tempfile"
#
# server = HTTP::Server.new(8085) do |context|
# server = HTTP::Server.new do |context|
# name = nil
# file = nil
# HTTP::FormData.parse(context.request) do |part|
Expand All @@ -34,6 +34,7 @@ require "./formdata/**"
# context.response << file.path
# end
#
# server.bind 8085
# server.listen
# ```
#
Expand Down
Loading

0 comments on commit c3635e1

Please sign in to comment.