fix :file_path - add requirements:

This commit is contained in:
Marc Siegfriedt 2017-08-21 21:09:45 +00:00
parent d540d43e2d
commit f3b6c552f6
3 changed files with 22 additions and 6 deletions

View file

@ -0,0 +1,5 @@
---
title: Fix the /projects/:id/repository/files/:file_path/raw endpoint to handle dots in the file_path
merge_request: 13512
author: mahcsig
type: fixed

View file

@ -1,5 +1,7 @@
module API module API
class Files < Grape::API class Files < Grape::API
FILE_ENDPOINT_REQUIREMENTS = API::PROJECT_ENDPOINT_REQUIREMENTS.merge(file_path: API::NO_SLASH_URL_PART_REGEX)
# Prevents returning plain/text responses for files with .txt extension # Prevents returning plain/text responses for files with .txt extension
after_validation { content_type "application/json" } after_validation { content_type "application/json" }
@ -58,13 +60,13 @@ module API
params do params do
requires :id, type: String, desc: 'The project ID' requires :id, type: String, desc: 'The project ID'
end end
resource :projects, requirements: { id: %r{[^/]+} } do resource :projects, requirements: FILE_ENDPOINT_REQUIREMENTS do
desc 'Get raw file contents from the repository' desc 'Get raw file contents from the repository'
params do params do
requires :file_path, type: String, desc: 'The url encoded path to the file. Ex. lib%2Fclass%2Erb' requires :file_path, type: String, desc: 'The url encoded path to the file. Ex. lib%2Fclass%2Erb'
requires :ref, type: String, desc: 'The name of branch, tag commit' requires :ref, type: String, desc: 'The name of branch, tag commit'
end end
get ":id/repository/files/:file_path/raw" do get ":id/repository/files/:file_path/raw", requirements: FILE_ENDPOINT_REQUIREMENTS do
assign_file_vars! assign_file_vars!
send_git_blob @repo, @blob send_git_blob @repo, @blob
@ -75,7 +77,7 @@ module API
requires :file_path, type: String, desc: 'The url encoded path to the file. Ex. lib%2Fclass%2Erb' requires :file_path, type: String, desc: 'The url encoded path to the file. Ex. lib%2Fclass%2Erb'
requires :ref, type: String, desc: 'The name of branch, tag or commit' requires :ref, type: String, desc: 'The name of branch, tag or commit'
end end
get ":id/repository/files/:file_path", requirements: { file_path: /.+/ } do get ":id/repository/files/:file_path", requirements: FILE_ENDPOINT_REQUIREMENTS do
assign_file_vars! assign_file_vars!
{ {
@ -95,7 +97,7 @@ module API
params do params do
use :extended_file_params use :extended_file_params
end end
post ":id/repository/files/:file_path", requirements: { file_path: /.+/ } do post ":id/repository/files/:file_path", requirements: FILE_ENDPOINT_REQUIREMENTS do
authorize! :push_code, user_project authorize! :push_code, user_project
file_params = declared_params(include_missing: false) file_params = declared_params(include_missing: false)
@ -113,7 +115,7 @@ module API
params do params do
use :extended_file_params use :extended_file_params
end end
put ":id/repository/files/:file_path", requirements: { file_path: /.+/ } do put ":id/repository/files/:file_path", requirements: FILE_ENDPOINT_REQUIREMENTS do
authorize! :push_code, user_project authorize! :push_code, user_project
file_params = declared_params(include_missing: false) file_params = declared_params(include_missing: false)
@ -137,7 +139,7 @@ module API
params do params do
use :simple_file_params use :simple_file_params
end end
delete ":id/repository/files/:file_path", requirements: { file_path: /.+/ } do delete ":id/repository/files/:file_path", requirements: FILE_ENDPOINT_REQUIREMENTS do
authorize! :push_code, user_project authorize! :push_code, user_project
file_params = declared_params(include_missing: false) file_params = declared_params(include_missing: false)

View file

@ -125,6 +125,15 @@ describe API::Files do
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
end end
it 'returns raw file info for files with dots' do
url = route('.gitignore') + "/raw"
expect(Gitlab::Workhorse).to receive(:send_git_blob)
get api(url, current_user), params
expect(response).to have_http_status(200)
end
it 'returns file by commit sha' do it 'returns file by commit sha' do
# This file is deleted on HEAD # This file is deleted on HEAD
file_path = "files%2Fjs%2Fcommit%2Ejs%2Ecoffee" file_path = "files%2Fjs%2Fcommit%2Ejs%2Ecoffee"