Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
af0eb56e
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
af0eb56e
编写于
9月 06, 2019
作者:
N
Nick Thomas
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'ac-accelerate-wiki-attachments' into 'master'
accelerate wiki attachments See merge request gitlab-org/gitlab-ce!32663
上级
6dd99d82
5b3ed2af
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
137 addition
and
10 deletion
+137
-10
changelogs/unreleased/ac-accelerate-wiki-attachments.yml
changelogs/unreleased/ac-accelerate-wiki-attachments.yml
+5
-0
lib/api/validations/types/workhorse_file.rb
lib/api/validations/types/workhorse_file.rb
+20
-0
lib/api/wikis.rb
lib/api/wikis.rb
+16
-6
lib/gitlab/middleware/multipart.rb
lib/gitlab/middleware/multipart.rb
+16
-2
spec/requests/api/wikis_spec.rb
spec/requests/api/wikis_spec.rb
+12
-1
spec/requests/projects/uploads_spec.rb
spec/requests/projects/uploads_spec.rb
+38
-0
spec/support/helpers/workhorse_helpers.rb
spec/support/helpers/workhorse_helpers.rb
+30
-1
未找到文件。
changelogs/unreleased/ac-accelerate-wiki-attachments.yml
0 → 100644
浏览文件 @
af0eb56e
---
title
:
Preprocess wiki attachments with GitLab-Workhorse
merge_request
:
32663
author
:
type
:
performance
lib/api/validations/types/workhorse_file.rb
0 → 100644
浏览文件 @
af0eb56e
# frozen_string_literal: true
module
API
module
Validations
module
Types
class
WorkhorseFile
<
Virtus
::
Attribute
def
coerce
(
input
)
# Processing of multipart file objects
# is already taken care of by Gitlab::Middleware::Multipart.
# Nothing to do here.
input
end
def
value_coerced?
(
value
)
value
.
is_a?
(
::
UploadedFile
)
end
end
end
end
end
lib/api/wikis.rb
浏览文件 @
af0eb56e
...
...
@@ -4,11 +4,21 @@ module API
class
Wikis
<
Grape
::
API
helpers
do
def
commit_params
(
attrs
)
{
file_name:
attrs
[
:file
][
:filename
],
file_content:
attrs
[
:file
][
:tempfile
].
read
,
branch_name:
attrs
[
:branch
]
}
# In order to avoid service disruption this can work with an old workhorse without the acceleration
# the first branch of this if must be removed when we drop support for non accelerated uploads
if
attrs
[
:file
].
is_a?
(
Hash
)
{
file_name:
attrs
[
:file
][
:filename
],
file_content:
attrs
[
:file
][
:tempfile
].
read
,
branch_name:
attrs
[
:branch
]
}
else
{
file_name:
attrs
[
:file
].
original_filename
,
file_content:
attrs
[
:file
].
read
,
branch_name:
attrs
[
:branch
]
}
end
end
params
:common_wiki_page_params
do
...
...
@@ -106,7 +116,7 @@ module API
success
Entities
::
WikiAttachment
end
params
do
requires
:file
,
type
:
::
API
::
Validations
::
Types
::
SafeFile
,
desc:
'The attachment file to be uploaded'
requires
:file
,
type
s:
[
::
API
::
Validations
::
Types
::
SafeFile
,
::
API
::
Validations
::
Types
::
WorkhorseFile
]
,
desc:
'The attachment file to be uploaded'
optional
:branch
,
type:
String
,
desc:
'The name of the branch'
end
post
":id/wikis/attachments"
do
...
...
lib/gitlab/middleware/multipart.rb
浏览文件 @
af0eb56e
...
...
@@ -32,7 +32,7 @@ module Gitlab
class
Handler
def
initialize
(
env
,
message
)
@request
=
ActionDispatch
::
Request
.
new
(
env
)
@request
=
Rack
::
Request
.
new
(
env
)
@rewritten_fields
=
message
[
'rewritten_fields'
]
@open_files
=
[]
end
...
...
@@ -50,7 +50,7 @@ module Gitlab
value
=
decorate_params_value
(
value
,
@request
.
params
[
key
])
end
@request
.
update_param
(
key
,
value
)
update_param
(
key
,
value
)
end
yield
...
...
@@ -92,6 +92,20 @@ module Gitlab
::
UploadedFile
.
from_params
(
params
,
key
,
allowed_paths
)
end
# update_params ensures that both rails controllers and rack middleware can find
# workhorse accelerate files in the request
def
update_param
(
key
,
value
)
# we make sure we have key in POST otherwise update_params will add it in GET
@request
.
POST
[
key
]
||=
value
# this will force Rack::Request to properly update env keys
@request
.
update_param
(
key
,
value
)
# ActionDispatch::Request is based on Rack::Request but it caches params
# inside other env keys, here we ensure everything is updated correctly
ActionDispatch
::
Request
.
new
(
@request
.
env
).
update_param
(
key
,
value
)
end
end
def
initialize
(
app
)
...
...
spec/requests/api/wikis_spec.rb
浏览文件 @
af0eb56e
...
...
@@ -11,6 +11,8 @@ require 'spec_helper'
# because they are 3 edge cases of using wiki pages.
describe
API
::
Wikis
do
include
WorkhorseHelpers
let
(
:user
)
{
create
(
:user
)
}
let
(
:group
)
{
create
(
:group
).
tap
{
|
g
|
g
.
add_owner
(
user
)
}
}
let
(
:project_wiki
)
{
create
(
:project_wiki
,
project:
project
,
user:
user
)
}
...
...
@@ -155,7 +157,7 @@ describe API::Wikis do
it
'pushes attachment to the wiki repository'
do
allow
(
SecureRandom
).
to
receive
(
:hex
).
and_return
(
'fixed_hex'
)
post
(
api
(
url
,
user
)
,
params:
payload
)
workhorse_post_with_file
(
api
(
url
,
user
),
file_key: :file
,
params:
payload
)
expect
(
response
).
to
have_gitlab_http_status
(
201
)
expect
(
json_response
).
to
eq
result_hash
.
deep_stringify_keys
...
...
@@ -180,6 +182,15 @@ describe API::Wikis do
expect
(
json_response
.
size
).
to
eq
(
1
)
expect
(
json_response
[
'error'
]).
to
eq
(
'file is invalid'
)
end
it
'is backward compatible with regular multipart uploads'
do
allow
(
SecureRandom
).
to
receive
(
:hex
).
and_return
(
'fixed_hex'
)
post
(
api
(
url
,
user
),
params:
payload
)
expect
(
response
).
to
have_gitlab_http_status
(
201
)
expect
(
json_response
).
to
eq
result_hash
.
deep_stringify_keys
end
end
describe
'GET /projects/:id/wikis'
do
...
...
spec/requests/projects/uploads_spec.rb
0 → 100644
浏览文件 @
af0eb56e
# frozen_string_literal: true
require
'spec_helper'
describe
'File uploads'
do
include
WorkhorseHelpers
let
(
:project
)
{
create
(
:project
,
:public
,
:repository
)
}
let
(
:user
)
{
create
(
:user
)
}
describe
'POST /:namespace/:project/create/:branch'
do
let
(
:branch
)
{
'master'
}
let
(
:create_url
)
{
project_blob_path
(
project
,
branch
)
}
let
(
:blob_url
)
{
project_blob_path
(
project
,
"
#{
branch
}
/dk.png"
)
}
let
(
:params
)
do
{
namespace_id:
project
.
namespace
,
project_id:
project
,
id:
branch
,
branch_name:
branch
,
file:
fixture_file_upload
(
'spec/fixtures/dk.png'
),
commit_message:
'Add an image'
}
end
before
do
project
.
add_maintainer
(
user
)
login_as
(
user
)
end
it
'redirects to blob'
do
workhorse_post_with_file
(
create_url
,
file_key: :file
,
params:
params
)
expect
(
response
).
to
redirect_to
(
blob_url
)
end
end
end
spec/support/helpers/workhorse_helpers.rb
浏览文件 @
af0eb56e
...
...
@@ -17,7 +17,36 @@ module WorkhorseHelpers
end
def
workhorse_internal_api_request_header
jwt_token
=
JWT
.
encode
({
'iss'
=>
'gitlab-workhorse'
},
Gitlab
::
Workhorse
.
secret
,
'HS256'
)
{
'HTTP_'
+
Gitlab
::
Workhorse
::
INTERNAL_API_REQUEST_HEADER
.
upcase
.
tr
(
'-'
,
'_'
)
=>
jwt_token
}
end
# workhorse_post_with_file will transform file_key inside params as if it was disk accelerated by workhorse
def
workhorse_post_with_file
(
url
,
file_key
:,
params
:)
workhorse_params
=
params
.
dup
file
=
workhorse_params
.
delete
(
file_key
)
workhorse_params
.
merge!
(
workhorse_disk_accelerated_file_params
(
file_key
,
file
))
post
(
url
,
params:
workhorse_params
,
headers:
workhorse_rewritten_fields_header
(
'file'
=>
file
.
path
)
)
end
private
def
jwt_token
(
data
=
{})
JWT
.
encode
({
'iss'
=>
'gitlab-workhorse'
}.
merge
(
data
),
Gitlab
::
Workhorse
.
secret
,
'HS256'
)
end
def
workhorse_rewritten_fields_header
(
fields
)
{
Gitlab
::
Middleware
::
Multipart
::
RACK_ENV_KEY
=>
jwt_token
(
'rewritten_fields'
=>
fields
)
}
end
def
workhorse_disk_accelerated_file_params
(
key
,
file
)
{
"
#{
key
}
.name"
=>
file
.
original_filename
,
"
#{
key
}
.path"
=>
file
.
path
}
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录