From bb1f9765865853c9db9d3e22b6f739609e017aba Mon Sep 17 00:00:00 2001 From: Benoit Tigeot Date: Fri, 22 Nov 2024 12:58:48 +0100 Subject: [PATCH] Provide a default host header to make request as valid as possible While working on this https://github.com/sinatra/sinatra/pull/2053 in our project. I noticed than when using Webmock, sinatra logs and especially the enforced rack-protection were showing this kind of logs: ``` D, [2024-11-22T13:05:16.798156 #26673] DEBUG -- : Rack::Protection::HostAuthorization @all_permitted_hosts=[".company.com"] @permitted_hosts=["company.com"] @domain_hosts=[/\A(?-mix:[a-z0-9\-.]+)company\.com\z/i] @ip_hosts=[] origin_host="" forwarded_host=nil ``` As you can see, `origin_host` is empty, because the header is missing. When not using webmock, we fallback on `net/http` host header setup. https://github.com/ruby/net-http/blob/cfbbb50c931a78fc2b5c731b9abeda161e1dfdd1/lib/net/http.rb#L2482 --- lib/webmock/http_lib_adapters/net_http.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/webmock/http_lib_adapters/net_http.rb b/lib/webmock/http_lib_adapters/net_http.rb index fd2a4a6f..1b585b16 100644 --- a/lib/webmock/http_lib_adapters/net_http.rb +++ b/lib/webmock/http_lib_adapters/net_http.rb @@ -257,6 +257,10 @@ def self.request_signature_from_request(net_http, request, body = nil) headers = Hash[*request.to_hash.map {|k,v| [k, v]}.inject([]) {|r,x| r + x}] + # Prevent empty Host header by providing similar behavior to Net::HTTP + # https://github.com/ruby/net-http/blob/cfbbb50c931a78fc2b5c731b9abeda161e1dfdd1/lib/net/http.rb#L2482 + headers['host'] = URI(uri).host if headers['host'].nil? + if request.body_stream body = request.body_stream.read request.body_stream = nil