2011-12-14 16:38:52 +00:00
|
|
|
class WebHook < ActiveRecord::Base
|
2015-02-05 22:20:55 +00:00
|
|
|
include Sortable
|
2011-12-14 16:38:52 +00:00
|
|
|
include HTTParty
|
|
|
|
|
2014-02-27 13:56:35 +00:00
|
|
|
default_value_for :push_events, true
|
|
|
|
default_value_for :issues_events, false
|
2016-08-30 20:56:26 +00:00
|
|
|
default_value_for :confidential_issues_events, false
|
2015-05-16 06:33:31 +00:00
|
|
|
default_value_for :note_events, false
|
2014-02-27 13:56:35 +00:00
|
|
|
default_value_for :merge_requests_events, false
|
2014-09-19 08:23:18 +00:00
|
|
|
default_value_for :tag_push_events, false
|
2015-12-07 12:23:23 +00:00
|
|
|
default_value_for :build_events, false
|
2016-08-02 10:06:31 +00:00
|
|
|
default_value_for :pipeline_events, false
|
2015-09-15 13:19:32 +00:00
|
|
|
default_value_for :enable_ssl_verification, true
|
2014-02-27 13:56:35 +00:00
|
|
|
|
2016-04-19 00:53:41 +00:00
|
|
|
scope :push_hooks, -> { where(push_events: true) }
|
|
|
|
scope :tag_push_hooks, -> { where(tag_push_events: true) }
|
|
|
|
|
2011-12-14 16:38:52 +00:00
|
|
|
# HTTParty timeout
|
2014-09-12 15:38:14 +00:00
|
|
|
default_timeout Gitlab.config.gitlab.webhook_timeout
|
2011-12-14 16:38:52 +00:00
|
|
|
|
2015-12-01 23:45:36 +00:00
|
|
|
validates :url, presence: true, url: true
|
2011-12-14 16:38:52 +00:00
|
|
|
|
2015-01-24 00:10:43 +00:00
|
|
|
def execute(data, hook_name)
|
2012-08-02 02:48:46 +00:00
|
|
|
parsed_url = URI.parse(url)
|
|
|
|
if parsed_url.userinfo.blank?
|
2015-12-02 00:15:01 +00:00
|
|
|
response = WebHook.post(url,
|
|
|
|
body: data.to_json,
|
2016-04-27 07:24:49 +00:00
|
|
|
headers: build_headers(hook_name),
|
2015-12-02 00:15:01 +00:00
|
|
|
verify: enable_ssl_verification)
|
2012-08-02 02:48:46 +00:00
|
|
|
else
|
2016-04-27 07:24:49 +00:00
|
|
|
post_url = url.gsub("#{parsed_url.userinfo}@", '')
|
2013-02-22 16:03:59 +00:00
|
|
|
auth = {
|
2016-01-12 09:32:25 +00:00
|
|
|
username: CGI.unescape(parsed_url.user),
|
|
|
|
password: CGI.unescape(parsed_url.password),
|
2013-02-22 16:03:59 +00:00
|
|
|
}
|
2015-12-02 00:15:01 +00:00
|
|
|
response = WebHook.post(post_url,
|
|
|
|
body: data.to_json,
|
2016-04-27 07:24:49 +00:00
|
|
|
headers: build_headers(hook_name),
|
2015-12-02 00:15:01 +00:00
|
|
|
verify: enable_ssl_verification,
|
|
|
|
basic_auth: auth)
|
2012-08-02 02:48:46 +00:00
|
|
|
end
|
2015-12-02 00:15:01 +00:00
|
|
|
|
2016-05-10 09:14:46 +00:00
|
|
|
[response.code, response.to_s]
|
2015-12-02 00:15:01 +00:00
|
|
|
rescue SocketError, OpenSSL::SSL::SSLError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e
|
2014-12-04 13:07:01 +00:00
|
|
|
logger.error("WebHook Error => #{e}")
|
2015-12-02 00:15:01 +00:00
|
|
|
[false, e.to_s]
|
2011-12-14 16:38:52 +00:00
|
|
|
end
|
2013-01-24 20:15:24 +00:00
|
|
|
|
2015-01-24 00:10:43 +00:00
|
|
|
def async_execute(data, hook_name)
|
|
|
|
Sidekiq::Client.enqueue(ProjectWebHookWorker, id, data, hook_name)
|
2013-01-24 20:15:24 +00:00
|
|
|
end
|
2016-04-27 07:24:49 +00:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def build_headers(hook_name)
|
|
|
|
headers = {
|
|
|
|
'Content-Type' => 'application/json',
|
|
|
|
'X-Gitlab-Event' => hook_name.singularize.titleize
|
|
|
|
}
|
|
|
|
headers['X-Gitlab-Token'] = token if token.present?
|
|
|
|
headers
|
|
|
|
end
|
2011-12-14 16:38:52 +00:00
|
|
|
end
|