diff --git a/lib/puppeteer/http_request.rb b/lib/puppeteer/http_request.rb index 28491f73..ccb070ed 100644 --- a/lib/puppeteer/http_request.rb +++ b/lib/puppeteer/http_request.rb @@ -217,8 +217,14 @@ def failure private def headers_to_array(headers) return nil unless headers - headers.map do |key, value| - { name: key, value: value.to_s } + headers.flat_map do |key, value| + if value.is_a?(Enumerable) + value.map do |v| + { name: key, value: v.to_s } + end + else + { name: key, value: value.to_s } + end end end @@ -349,7 +355,12 @@ def respond(status: nil, headers: nil, content_type: nil, body: nil, priority: n mock_response_headers = {} headers&.each do |key, value| - mock_response_headers[key.downcase] = value + mock_response_headers[key.downcase] = + if value.is_a?(Enumerable) + value.map(&:to_s) + else + value.to_s + end end if content_type mock_response_headers['content-type'] = content_type diff --git a/spec/integration/request_interception_spec.rb b/spec/integration/request_interception_spec.rb index 50ff9a19..ad35a8ee 100644 --- a/spec/integration/request_interception_spec.rb +++ b/spec/integration/request_interception_spec.rb @@ -36,6 +36,34 @@ page.goto(server_empty_page) end + + it 'should allow mocking multiple headers with same key', sinatra: true do + page.request_interception = true + page.on('request') do |request| + request.respond( + status: 200, + headers: { + foo: 'bar', + arr: ['1', '2'], + 'set-cookie': ['first=1', 'second=2'], + }, + body: 'Hello world', + ) + end + + response = page.goto(server_empty_page) + cookies = page.cookies + first_cookie = cookies.find { |cookie| cookie['name'] == 'first' } + second_cookie = cookies.find { |cookie| cookie['name'] == 'second' } + + expect(response.status).to eq(200) + expect(response.headers['foo']).to eq('bar') + expect(response.headers['arr']).to eq("1\n2") + # request.respond() will not trigger Network.responseReceivedExtraInfo + # fail to get 'set-cookie' header from response + expect(first_cookie['value']).to eq('1') + expect(second_cookie['value']).to eq('2') + end end # https://github.com/puppeteer/puppeteer/blob/e2e98376b9a3fa9a2501ddc86ff6407f3b59887d/docs/api.md#cooperative-intercept-mode-and-legacy-intercept-mode