diff --git a/lib/webmock/http_lib_adapters/http_rb/request.rb b/lib/webmock/http_lib_adapters/http_rb/request.rb index 078be318..32b36b7f 100644 --- a/lib/webmock/http_lib_adapters/http_rb/request.rb +++ b/lib/webmock/http_lib_adapters/http_rb/request.rb @@ -3,11 +3,21 @@ module HTTP class Request def webmock_signature - request_body = if defined?(HTTP::Request::Body) - String.new.tap { |string| body.each { |part| string << part } } - else - body - end + request_body = nil + + if defined?(HTTP::Request::Body) + request_body = String.new + first_chunk_encoding = nil + body.each do |part| + request_body << part + first_chunk_encoding ||= part.encoding + end + + request_body.force_encoding(first_chunk_encoding) if first_chunk_encoding + request_body + else + request_body = body + end ::WebMock::RequestSignature.new(verb, uri.to_s, { headers: headers.to_h, diff --git a/spec/acceptance/http_rb/http_rb_spec.rb b/spec/acceptance/http_rb/http_rb_spec.rb index 097e7760..409f4b63 100644 --- a/spec/acceptance/http_rb/http_rb_spec.rb +++ b/spec/acceptance/http_rb/http_rb_spec.rb @@ -90,4 +90,12 @@ response.connection.close end end + + it "should preserve request body encoding when matching requests" do + stub_request(:post, "www.example.com").with(body: (lambda {|body| + body.encoding == Encoding::UTF_8 + })) + http_request(:post, "http://www.example.com/", body: "abc") + end + end