14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program. If not, see <https://www.gnu.org/licenses/>.
16
16
17
+ require "json"
17
18
require "openssl"
19
+ require_relative "payload"
18
20
require_relative "response"
21
+ require_relative "source-archive"
19
22
20
23
module Deployer
21
24
class App
22
25
def call ( env )
23
26
request = Rack ::Request . new ( env )
24
27
response = Response . new
25
- process ( request , response )
26
- response . finish
28
+ process ( request , response ) || response . finish
27
29
end
28
30
29
31
private
@@ -38,6 +40,10 @@ def process(request, response)
38
40
response . set ( :unauthorized , "Authorization failed" )
39
41
return
40
42
end
43
+
44
+ payload = parse_payload ( request , response )
45
+ return if payload . nil?
46
+ process_payload ( request , response , payload )
41
47
end
42
48
43
49
def valid_signature? ( request )
@@ -47,5 +53,60 @@ def valid_signature?(request)
47
53
signature = "sha256=#{ hmac_sha256 } "
48
54
Rack ::Utils . secure_compare ( signature , request . env [ "HTTP_X_HUB_SIGNATURE_256" ] )
49
55
end
56
+
57
+ def parse_payload ( request , response )
58
+ unless request . media_type == "application/json"
59
+ response . set ( :bad_request , "invalid payload format" )
60
+ return
61
+ end
62
+
63
+ payload = request . body . read
64
+ if payload . nil?
65
+ response . set ( :bad_request , "payload is missing" )
66
+ return
67
+ end
68
+
69
+ begin
70
+ JSON . parse ( payload )
71
+ rescue JSON ::ParserError
72
+ response . set ( :bad_request , "invalid JSON format: <#{ $!. message } >" )
73
+ nil
74
+ end
75
+ end
76
+
77
+ def process_payload ( request , response , raw_payload )
78
+ metadata = {
79
+ "x-github-event" => request . env [ "HTTP_X_GITHUB_EVENT" ]
80
+ }
81
+
82
+ payload = Payload . new ( raw_payload , metadata )
83
+
84
+ case payload . event_name
85
+ when "ping"
86
+ # Do nothing because this is a kind of healthcheck.
87
+ nil
88
+ when "workflow_run"
89
+ return unless payload . released?
90
+ process_release ( request , response , payload )
91
+ else
92
+ response . set ( :bad_request ,
93
+ "Unsupported event: <#{ payload . event_name } >" )
94
+ nil
95
+ end
96
+ end
97
+
98
+ def process_release ( request , response , payload )
99
+ response . finish do
100
+ Thread . new do
101
+ gpg_key_id = "TODO: handle a GPG key"
102
+ archive = Deployer ::SourceArchive . new ( payload . repository_owner ,
103
+ payload . repository_name ,
104
+ payload . repository_name ,
105
+ payload . version ,
106
+ payload . branch )
107
+ archive . process ( gpg_key_id )
108
+ end
109
+ end
110
+ end
50
111
end
51
112
end
0 commit comments