From 798cc036608f3786471d888787edb40322e738dd Mon Sep 17 00:00:00 2001 From: alistairjevans Date: Tue, 19 Aug 2025 07:15:44 +0100 Subject: [PATCH 1/2] Make sure we can capture the host header in HTTP1 and HTTP2. --- ext/hyper_ruby/src/lib.rs | 1 + ext/hyper_ruby/src/request.rs | 14 ++++++++++++++ test/test_http.rb | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/ext/hyper_ruby/src/lib.rs b/ext/hyper_ruby/src/lib.rs index b8a35f7..e71f070 100644 --- a/ext/hyper_ruby/src/lib.rs +++ b/ext/hyper_ruby/src/lib.rs @@ -608,6 +608,7 @@ fn init(ruby: &Ruby) -> Result<(), MagnusError> { request_class.define_method("path", method!(Request::path, 0))?; request_class.define_method("query_params", method!(Request::query_params, 0))?; request_class.define_method("query_param", method!(Request::query_param, 1))?; + request_class.define_method("host", method!(Request::host, 0))?; request_class.define_method("header", method!(Request::header, 1))?; request_class.define_method("headers", method!(Request::headers, 0))?; request_class.define_method("body", method!(Request::body, 0))?; diff --git a/ext/hyper_ruby/src/request.rs b/ext/hyper_ruby/src/request.rs index 4c38991..461c3d9 100644 --- a/ext/hyper_ruby/src/request.rs +++ b/ext/hyper_ruby/src/request.rs @@ -105,6 +105,20 @@ impl Request { RString::new(self.request.uri().path()) } + pub fn host(&self) -> Value { + match self.request.uri().host() { + Some(host) => RString::new(host).as_value(), + // Fallback to Host header if no host in URI object + None => match self.request.headers().get("Host") { + Some(value) => match value.to_str() { + Ok(value) => RString::new(value).as_value(), + Err(_) => qnil().as_value(), + }, + None => qnil().as_value(), + } + } + } + pub fn query_params(&self) -> RHash { let params = RHash::new(); if let Some(query) = self.request.uri().query() { diff --git a/test/test_http.rb b/test/test_http.rb index 0148ac5..14c1f7b 100644 --- a/test/test_http.rb +++ b/test/test_http.rb @@ -241,6 +241,35 @@ def test_query_params_with_encoding end end + def test_host + with_server(-> (request) { handler_return_host(request) }) do |client| + response = client.get("/") + assert_equal 200, response.status + # The Host header should contain the server address + host_header = JSON.parse(response.body)["message"] + assert_match(/127\.0\.0\.1/, host_header) + end + end + + def test_http2_host + with_server(-> (request) { handler_return_host(request) }) do |client| + # Configure client for HTTP/2 + client = client.with( + debug: STDERR, + debug_level: 3, + fallback_protocol: "h2" + ) + + response = client.get("/") + assert_equal 200, response.status + assert_equal "2.0", response.version + + # The Host header should contain the server address + host_header = JSON.parse(response.body)["message"] + assert_match(/127\.0\.0\.1/, host_header) + end + end + private def handler_simple(request) @@ -256,6 +285,11 @@ def handler_return_header(request, header_key) HyperRuby::Response.new(200, { 'Content-Type' => 'application/json' }, { message: request.header(header_key) }.to_json) end + def handler_return_host(request) + pp request.host() + HyperRuby::Response.new(200, { 'Content-Type' => 'application/json' }, { message: request.host() }.to_json) + end + def handler_return_all_headers(request) HyperRuby::Response.new(200, { 'Content-Type' => 'application/json' }, { headers: request.headers }.to_json) end From 62c6c451c33d1e0321c49c5521dbc43208965141 Mon Sep 17 00:00:00 2001 From: alistairjevans Date: Tue, 19 Aug 2025 07:16:50 +0100 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=92=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test_http.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_http.rb b/test/test_http.rb index 14c1f7b..8617a5d 100644 --- a/test/test_http.rb +++ b/test/test_http.rb @@ -286,7 +286,6 @@ def handler_return_header(request, header_key) end def handler_return_host(request) - pp request.host() HyperRuby::Response.new(200, { 'Content-Type' => 'application/json' }, { message: request.host() }.to_json) end