diff --git a/changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml b/changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml new file mode 100644 index 0000000000000000000000000000000000000000..ba61d378cda03921e5be9f80569b9563a59e691a --- /dev/null +++ b/changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml @@ -0,0 +1,5 @@ +--- +title: Fix bug setting http headers in Files API +merge_request: 20938 +author: +type: fixed diff --git a/lib/api/helpers/headers_helpers.rb b/lib/api/helpers/headers_helpers.rb index cde51fccc62a4ef33f5d1ef6d481659863af20b0..c9c44e3c2183d7f044803a5dc6b90aa973b3da95 100644 --- a/lib/api/helpers/headers_helpers.rb +++ b/lib/api/helpers/headers_helpers.rb @@ -3,7 +3,11 @@ module API module HeadersHelpers def set_http_headers(header_data) header_data.each do |key, value| - header "X-Gitlab-#{key.to_s.split('_').collect(&:capitalize).join('-')}", value + if value.is_a?(Enumerable) + raise ArgumentError.new("Header value should be a string") + end + + header "X-Gitlab-#{key.to_s.split('_').collect(&:capitalize).join('-')}", value.to_s end end end diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb index 4bc5d3ee899b9dbad453666527b9352d7d719727..0aec186f7384bd6a86090602908b9c705f03e4cb 100644 --- a/spec/requests/api/files_spec.rb +++ b/spec/requests/api/files_spec.rb @@ -13,6 +13,24 @@ describe API::Files do let(:author_email) { 'user@example.org' } let(:author_name) { 'John Doe' } + let(:helper) do + fake_class = Class.new do + include ::API::Helpers::HeadersHelpers + + attr_reader :headers + + def initialize + @headers = {} + end + + def header(key, value) + @headers[key] = value + end + end + + fake_class.new + end + before do project.add_developer(user) end @@ -21,6 +39,18 @@ describe API::Files do "/projects/#{project.id}/repository/files/#{file_path}" end + context 'http headers' do + it 'converts value into string' do + helper.set_http_headers(test: 1) + + expect(helper.headers).to eq({ 'X-Gitlab-Test' => '1' }) + end + + it 'raises exception if value is an Enumerable' do + expect { helper.set_http_headers(test: [1]) }.to raise_error(ArgumentError) + end + end + describe "HEAD /projects/:id/repository/files/:file_path" do shared_examples_for 'repository files' do it 'returns file attributes in headers' do