From 2612dcd1b7f6c7c9dcd9837c9a8416c53da6bf6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Tue, 6 Mar 2018 13:44:56 +0000 Subject: [PATCH] Add `HTTP::Server::Context#socket` This allows to determine the client connection when a `HTTP::Server` binds to multiple interfaces. --- spec/std/http/server/server_spec.cr | 7 ++++++- src/http/server/context.cr | 5 ++++- src/http/server/request_processor.cr | 7 ++++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/spec/std/http/server/server_spec.cr b/spec/std/http/server/server_spec.cr index df550e4b06d1..6d55f8e1d9ac 100644 --- a/spec/std/http/server/server_spec.cr +++ b/spec/std/http/server/server_spec.cr @@ -240,7 +240,11 @@ module HTTP it "binds to different ports" do server = Server.new do |context| - context.response.print "Test Server (#{context.request.headers["Host"]?})" + socket = context.socket + socket.should be_a(TCPSocket) + if socket.is_a? TCPSocket + context.response.print "Test Server (127.0.0.1:#{socket.local_address.port})" + end end tcp_server = TCPServer.new(0) @@ -266,6 +270,7 @@ module HTTP processor = HTTP::Server::RequestProcessor.new do |context| context.response.content_type = "text/plain" context.response.print "Hello world" + context.socket.should be_nil end input = IO::Memory.new("GET / HTTP/1.1\r\n\r\n") diff --git a/src/http/server/context.cr b/src/http/server/context.cr index 85ec07572282..57c2b6bae912 100644 --- a/src/http/server/context.cr +++ b/src/http/server/context.cr @@ -7,8 +7,11 @@ class HTTP::Server # The `HTTP::Server::Response` to configure and write to. getter response : Response + # An optional `Socket` which holds the client connection of this context. + getter socket : Socket? + # :nodoc: - def initialize(@request : Request, @response : Response) + def initialize(@request : Request, @response : Response, @socket : Socket? = nil) end end end diff --git a/src/http/server/request_processor.cr b/src/http/server/request_processor.cr index 44d05d837737..8e9437d9628a 100644 --- a/src/http/server/request_processor.cr +++ b/src/http/server/request_processor.cr @@ -33,7 +33,12 @@ class HTTP::Server::RequestProcessor response.version = request.version response.reset response.headers["Connection"] = "keep-alive" if request.keep_alive? - context = Context.new(request, response) + + if input.is_a?(Socket) + context = Context.new(request, response, input) + else + context = Context.new(request, response) + end begin @handler.call(context)