diff --git a/src/http/request.cr b/src/http/request.cr index 8a7ee7cee8d9..4850f6dcde12 100644 --- a/src/http/request.cr +++ b/src/http/request.cr @@ -19,8 +19,9 @@ class HTTP::Request @cookies : Cookies? @query_params : Params? @uri : URI? + @io : IO? - def initialize(@method : String, @resource : String, headers : Headers? = nil, body : String | Bytes | IO | Nil = nil, @version = "HTTP/1.1") + def initialize(@method : String, @resource : String, headers : Headers? = nil, body : String | Bytes | IO | Nil = nil, @version = "HTTP/1.1", @io : IO? = nil) @headers = headers.try(&.dup) || Headers.new self.body = body end @@ -99,13 +100,27 @@ class HTTP::Request return BadRequest.new unless HTTP::SUPPORTED_VERSIONS.includes?(http_version) HTTP.parse_headers_and_body(io) do |headers, body| - return new method, resource, headers, body, http_version + return new method, resource, headers, body, http_version, io end # Malformed or unexpectedly ended http request BadRequest.new end + def remote_address + if (io = @io).responds_to?(:remote_address) + io.remote_address + else + raise "#{io} doesn't have a remote address" + end + end + + def remote_address? + if (io = @io).responds_to?(:remote_address) + io.remote_address + end + end + # Lazily parses and return the request's path component. def path uri.path || "/" diff --git a/src/openssl/ssl/socket.cr b/src/openssl/ssl/socket.cr index 0f490882e811..5de1ca9dffd5 100644 --- a/src/openssl/ssl/socket.cr +++ b/src/openssl/ssl/socket.cr @@ -173,6 +173,20 @@ abstract class OpenSSL::SSL::Socket < IO raise IO::Error.new("Can't rewind OpenSSL::SSL::Socket::Client") end + def remote_address + if (io = @bio.io).responds_to?(:remote_address) + io.remote_address + else + raise "#{io} doesn't have a remote address" + end + end + + def remote_address? + if (io = @bio.io).responds_to?(:remote_address) + io.remote_address + end + end + # Returns the hostname provided through Server Name Indication (SNI) def hostname : String? if host_name = LibSSL.ssl_get_servername(@ssl, LibSSL::TLSExt::NAMETYPE_host_name)