Add documentation and specs for webhook URL rewriting
This commit is contained in:
parent
7ff24772b6
commit
0d9ef34a25
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Include full image URL in webhooks for uploaded images
|
||||||
|
merge_request: 18109
|
||||||
|
author: Satish Perala
|
||||||
|
type: changed
|
||||||
|
|
@ -6,6 +6,13 @@ Starting from GitLab 8.5:
|
||||||
- the `project.ssh_url` key is deprecated in favor of the `project.git_ssh_url` key
|
- the `project.ssh_url` key is deprecated in favor of the `project.git_ssh_url` key
|
||||||
- the `project.http_url` key is deprecated in favor of the `project.git_http_url` key
|
- the `project.http_url` key is deprecated in favor of the `project.git_http_url` key
|
||||||
|
|
||||||
|
>**Note**
|
||||||
|
Starting from GitLab 11.2:
|
||||||
|
- The `description` field for issues, merge requests, comments, and wiki pages
|
||||||
|
is rewritten so that simple Markdown image references (like
|
||||||
|
``) have their target URL changed to an absolute URL. See
|
||||||
|
[image URL rewriting](#image-url-rewriting) for more details.
|
||||||
|
|
||||||
Project webhooks allow you to trigger a URL if for example new code is pushed or
|
Project webhooks allow you to trigger a URL if for example new code is pushed or
|
||||||
a new issue is created. You can configure webhooks to listen for specific events
|
a new issue is created. You can configure webhooks to listen for specific events
|
||||||
like pushes, issues or merge requests. GitLab will send a POST request with data
|
like pushes, issues or merge requests. GitLab will send a POST request with data
|
||||||
|
|
@ -1121,6 +1128,27 @@ X-Gitlab-Event: Build Hook
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Image URL rewriting
|
||||||
|
|
||||||
|
From GitLab 11.2, simple image references are rewritten to use an absolute URL
|
||||||
|
in webhooks. So if an image, merge request, comment, or wiki page has this in
|
||||||
|
its description:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
It will appear in the webhook body as the below (assuming that GitLab is
|
||||||
|
installed at gitlab.example.com):
|
||||||
|
|
||||||
|
```markdown
|
||||||
|

|
||||||
|
```
|
||||||
|
|
||||||
|
This will not rewrite URLs that already are pointing to HTTP, HTTPS, or
|
||||||
|
protocol-relative URLs. It will also not rewrite image URLs using advanced
|
||||||
|
Markdown features, like link labels.
|
||||||
|
|
||||||
## Testing webhooks
|
## Testing webhooks
|
||||||
|
|
||||||
You can trigger the webhook manually. Sample data from the project will be used.Sample data will take from the project.
|
You can trigger the webhook manually. Sample data from the project will be used.Sample data will take from the project.
|
||||||
|
|
|
||||||
|
|
@ -2,27 +2,7 @@ module Banzai
|
||||||
module Filter
|
module Filter
|
||||||
class BlockquoteFenceFilter < HTML::Pipeline::TextFilter
|
class BlockquoteFenceFilter < HTML::Pipeline::TextFilter
|
||||||
REGEX = %r{
|
REGEX = %r{
|
||||||
(?<code>
|
#{::Gitlab::Regex.markdown_code_or_html_blocks}
|
||||||
# Code blocks:
|
|
||||||
# ```
|
|
||||||
# Anything, including `>>>` blocks which are ignored by this filter
|
|
||||||
# ```
|
|
||||||
|
|
||||||
^```
|
|
||||||
.+?
|
|
||||||
\n```\ *$
|
|
||||||
)
|
|
||||||
|
|
|
||||||
(?<html>
|
|
||||||
# HTML block:
|
|
||||||
# <tag>
|
|
||||||
# Anything, including `>>>` blocks which are ignored by this filter
|
|
||||||
# </tag>
|
|
||||||
|
|
||||||
^<[^>]+?>\ *\n
|
|
||||||
.+?
|
|
||||||
\n<\/[^>]+?>\ *$
|
|
||||||
)
|
|
||||||
|
|
|
|
||||||
(?:
|
(?:
|
||||||
# Blockquote:
|
# Blockquote:
|
||||||
|
|
|
||||||
|
|
@ -3,17 +3,36 @@ module Gitlab
|
||||||
class BaseBuilder
|
class BaseBuilder
|
||||||
attr_accessor :object
|
attr_accessor :object
|
||||||
|
|
||||||
|
MARKDOWN_SIMPLE_IMAGE = %r{
|
||||||
|
#{::Gitlab::Regex.markdown_code_or_html_blocks}
|
||||||
|
|
|
||||||
|
(?<image>
|
||||||
|
!
|
||||||
|
\[(?<title>[^\n]*?)\]
|
||||||
|
\((?<url>(?!(https?://|//))[^\n]+?)\)
|
||||||
|
)
|
||||||
|
}mx.freeze
|
||||||
|
|
||||||
def initialize(object)
|
def initialize(object)
|
||||||
@object = object
|
@object = object
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.absolute_image_urls(markdown_text)
|
||||||
|
return markdown_text unless markdown_text.present?
|
||||||
|
|
||||||
|
markdown_text.gsub(MARKDOWN_SIMPLE_IMAGE) do
|
||||||
|
if $~[:image]
|
||||||
|
"![#{$~[:title]}](#{Gitlab.config.gitlab.url}/#{$~[:url]})"
|
||||||
|
else
|
||||||
|
$~[0]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def absolute_image_urls(markdown_text)
|
def absolute_image_urls(markdown_text)
|
||||||
return markdown_text unless markdown_text.present?
|
self.class.absolute_image_urls(markdown_text)
|
||||||
|
|
||||||
markdown_text.gsub(/!\[(.*?)\]\((.*?)\)/,
|
|
||||||
"")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -60,13 +60,6 @@ module Gitlab
|
||||||
hash
|
hash
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def absolute_image_urls(markdown_text)
|
|
||||||
return markdown_text unless markdown_text.present?
|
|
||||||
|
|
||||||
markdown_text.gsub(/!\[(.*?)\]\((.*?)\)/,
|
|
||||||
"")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -73,5 +73,31 @@ module Gitlab
|
||||||
def build_trace_section_regex
|
def build_trace_section_regex
|
||||||
@build_trace_section_regexp ||= /section_((?:start)|(?:end)):(\d+):([a-zA-Z0-9_.-]+)\r\033\[0K/.freeze
|
@build_trace_section_regexp ||= /section_((?:start)|(?:end)):(\d+):([a-zA-Z0-9_.-]+)\r\033\[0K/.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def markdown_code_or_html_blocks
|
||||||
|
@markdown_code_or_html_blocks ||= %r{
|
||||||
|
(?<code>
|
||||||
|
# Code blocks:
|
||||||
|
# ```
|
||||||
|
# Anything, including `>>>` blocks which are ignored by this filter
|
||||||
|
# ```
|
||||||
|
|
||||||
|
^```
|
||||||
|
.+?
|
||||||
|
\n```\ *$
|
||||||
|
)
|
||||||
|
|
|
||||||
|
(?<html>
|
||||||
|
# HTML block:
|
||||||
|
# <tag>
|
||||||
|
# Anything, including `>>>` blocks which are ignored by this filter
|
||||||
|
# </tag>
|
||||||
|
|
||||||
|
^<[^>]+?>\ *\n
|
||||||
|
.+?
|
||||||
|
\n<\/[^>]+?>\ *$
|
||||||
|
)
|
||||||
|
}mx
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Gitlab::HookData::BaseBuilder do
|
||||||
|
describe '.absolute_image_urls' do
|
||||||
|
using RSpec::Parameterized::TableSyntax
|
||||||
|
|
||||||
|
where do
|
||||||
|
{
|
||||||
|
'relative image URL' => {
|
||||||
|
input: '',
|
||||||
|
output: ""
|
||||||
|
},
|
||||||
|
'HTTP URL' => {
|
||||||
|
input: '',
|
||||||
|
output: ''
|
||||||
|
},
|
||||||
|
'HTTPS URL' => {
|
||||||
|
input: '',
|
||||||
|
output: ''
|
||||||
|
},
|
||||||
|
'protocol-relative URL' => {
|
||||||
|
input: '',
|
||||||
|
output: ''
|
||||||
|
},
|
||||||
|
'URL reference by title' => {
|
||||||
|
input: "![foo]\n\n[foo]: foo.png",
|
||||||
|
output: "![foo]\n\n[foo]: foo.png"
|
||||||
|
},
|
||||||
|
'URL reference by label' => {
|
||||||
|
input: "![][foo]\n\n[foo]: foo.png",
|
||||||
|
output: "![][foo]\n\n[foo]: foo.png"
|
||||||
|
},
|
||||||
|
'in Markdown inline code block' => {
|
||||||
|
input: '``',
|
||||||
|
output: "``"
|
||||||
|
},
|
||||||
|
'in HTML tag on the same line' => {
|
||||||
|
input: '<p></p>',
|
||||||
|
output: "<p></p>"
|
||||||
|
},
|
||||||
|
'in Markdown multi-line code block' => {
|
||||||
|
input: "```\n\n```",
|
||||||
|
output: "```\n\n```"
|
||||||
|
},
|
||||||
|
'in HTML tag on different lines' => {
|
||||||
|
input: "<p>\n\n</p>",
|
||||||
|
output: "<p>\n\n</p>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
with_them do
|
||||||
|
it { expect(described_class.absolute_image_urls(input)).to eq(output) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue