-
Notifications
You must be signed in to change notification settings - Fork 117
/
Copy pathcall_webservices.rb
122 lines (100 loc) · 2.73 KB
/
call_webservices.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# frozen_string_literal: true
module RedmineHooks
class CallWebservices < Base
include HttpHelper
attr_reader :payloads_to_send
def initialize(*args)
super
@payloads_to_send = []
set_payloads_to_send
end
def call
execute_hook do |out|
if needs_push?
out << call_webservice
else
out << "#{skip_message}\n"
logger.info skip_message
end
end
end
def post_receive_url
object
end
def needs_push?
return false if payloads.empty?
return true unless use_triggers?
return false if post_receive_url.triggers.empty?
!payloads_to_send.empty?
end
def start_message
uri = URI post_receive_url.url
if uri.password.present?
uri.user = nil
uri.password = nil
"Notifying #{uri} (with base auth)"
else
"Notifying #{post_receive_url.url}"
end
end
def skip_message
"This url doesn't need to be notified"
end
def with_empty_payload?
post_receive_url.mode == :post
end
def empty_payload
{ empty: true }
end
private
def set_payloads_to_send
@payloads_to_send = if use_triggers?
extract_payloads
elsif with_empty_payload?
empty_payload
else
payloads
end
end
def extract_payloads
new_payloads = []
payloads.each do |payload|
data = RedmineGitHosting::Utils::Git.parse_refspec payload[:ref]
next unless data[:type] == 'heads' && post_receive_url.triggers.include?(data[:name])
new_payloads << (with_empty_payload? ? empty_payload : payload)
end
new_payloads
end
def use_method
post_receive_url.mode == :get ? :http_get : :http_post
end
def use_triggers?
post_receive_url.use_triggers?
end
def split_payloads?
post_receive_url.split_payloads?
end
def call_webservice
if use_method == :http_post && split_payloads?
y = +''
payloads_to_send.each do |payload|
y << do_call_webservice(payload)
end
y
else
do_call_webservice payloads_to_send
end
end
def do_call_webservice(payload)
post_failed, post_message = send(use_method, post_receive_url.url, { data: { payload: payload } })
if post_failed
logger.error 'Failed!'
logger.error post_message
(split_payloads? ? failure_message.delete("\n") : failure_message)
else
log_hook_succeeded
(split_payloads? ? success_message.delete("\n") : success_message)
end
end
end
end