|
35 | 35 | # Validation Functions #
|
36 | 36 | ########################
|
37 | 37 |
|
38 |
| -has_event_header(request::HTTP.Request) = haskey(HTTP.headers(request), "X-Github-Event") |
39 |
| -event_header(request::HTTP.Request) = HTTP.headers(request)["X-Github-Event"] |
| 38 | +has_event_header(request::HTTP.Request) = HTTP.hasheader(request, "X-Github-Event") |
| 39 | +event_header(request::HTTP.Request) = HTTP.header(request, "X-Github-Event") |
40 | 40 |
|
41 |
| -has_sig_header(request::HTTP.Request) = haskey(HTTP.headers(request), "X-Hub-Signature") |
42 |
| -sig_header(request::HTTP.Request) = HTTP.headers(request)["X-Hub-Signature"] |
| 41 | +has_sig_header(request::HTTP.Request) = HTTP.hasheader(request, "X-Hub-Signature") |
| 42 | +sig_header(request::HTTP.Request) = HTTP.header(request, "X-Hub-Signature") |
43 | 43 |
|
44 | 44 | function has_valid_secret(request::HTTP.Request, secret)
|
45 | 45 | if has_sig_header(request)
|
46 |
| - secret_sha = "sha1="*bytes2hex(MbedTLS.digest(MbedTLS.MD_SHA1, String(request), secret)) |
| 46 | + secret_sha = "sha1="*bytes2hex(MbedTLS.digest(MbedTLS.MD_SHA1, HTTP.load(request), secret)) |
47 | 47 | return sig_header(request) == secret_sha
|
48 | 48 | end
|
49 | 49 | return false
|
|
62 | 62 | #################
|
63 | 63 |
|
64 | 64 | struct EventListener
|
65 |
| - server::HTTP.Server |
| 65 | + handle_request |
66 | 66 | repos
|
67 | 67 | events
|
68 | 68 | function EventListener(handle; auth::Authorization = AnonymousAuth(),
|
69 | 69 | secret = nothing, events = nothing,
|
70 | 70 | repos = nothing, forwards = nothing)
|
71 |
| - if !(isa(forwards, Void)) |
| 71 | + if !(isa(forwards, Nothing)) |
72 | 72 | forwards = map(HTTP.URI, forwards)
|
73 | 73 | end
|
74 | 74 |
|
75 |
| - if !(isa(repos, Void)) |
| 75 | + if !(isa(repos, Nothing)) |
76 | 76 | repos = map(name, repos)
|
77 | 77 | end
|
78 | 78 |
|
79 |
| - server = HTTP.Server() do request, response |
80 |
| - try |
81 |
| - handle_event_request(request, handle; auth = auth, |
82 |
| - secret = secret, events = events, |
83 |
| - repos = repos, forwards = forwards) |
84 |
| - catch err |
85 |
| - bt = catch_backtrace() |
86 |
| - print(STDERR, "SERVER ERROR: ") |
87 |
| - Base.showerror(STDERR, err, bt) |
88 |
| - return HTTP.Response(500) |
89 |
| - end |
90 |
| - end |
| 79 | + handle_request = request::HTTP.Request -> |
| 80 | + handle_event_request(request, handle; auth = auth, |
| 81 | + secret = secret, events = events, |
| 82 | + repos = repos, forwards = forwards) |
91 | 83 |
|
92 |
| - return new(server, repos, events) |
| 84 | + return new(handle_request, repos, events) |
93 | 85 | end
|
94 | 86 | end
|
95 | 87 |
|
96 | 88 | function handle_event_request(request, handle;
|
97 | 89 | auth::Authorization = AnonymousAuth(),
|
98 | 90 | secret = nothing, events = nothing,
|
99 | 91 | repos = nothing, forwards = nothing)
|
100 |
| - if !(isa(secret, Void)) && !(has_valid_secret(request, secret)) |
| 92 | + if !(isa(secret, Nothing)) && !(has_valid_secret(request, secret)) |
101 | 93 | return HTTP.Response(400, "invalid signature")
|
102 | 94 | end
|
103 | 95 |
|
104 |
| - if !(isa(events, Void)) && !(is_valid_event(request, events)) |
| 96 | + if !(isa(events, Nothing)) && !(is_valid_event(request, events)) |
105 | 97 | return HTTP.Response(204, "event ignored")
|
106 | 98 | end
|
107 | 99 |
|
108 |
| - event = event_from_payload!(event_header(request), JSON.parse(String(request))) |
| 100 | + event = event_from_payload!(event_header(request), JSON.parse(HTTP.load(request))) |
109 | 101 |
|
110 |
| - if !(isa(repos, Void)) && !(from_valid_repo(event, repos)) |
| 102 | + if !(isa(repos, Nothing)) && !(from_valid_repo(event, repos)) |
111 | 103 | return HTTP.Response(400, "invalid repo")
|
112 | 104 | end
|
113 | 105 |
|
114 |
| - if !(isa(forwards, Void)) |
| 106 | + if !(isa(forwards, Nothing)) |
115 | 107 | for address in forwards
|
116 | 108 | HTTP.post(address, request)
|
117 | 109 | end
|
118 | 110 | end
|
119 | 111 |
|
120 |
| - retval = handle(event) |
121 |
| - if retval isa HttpCommon.Response |
122 |
| - Base.depwarn("event handlers should return an `HTTP.Response` instead of an `HttpCommon.Response`, |
123 |
| - making a best effort to convert to an `HTTP.Response`", :handle_event_request) |
124 |
| - retval = HTTP.Response(; status = retval.status, headers = convert(Dict{String, String}, retval.headers), |
125 |
| - body = HTTP.FIFOBuffer(retval.data)) |
126 |
| - end |
127 |
| - return retval |
| 112 | + return handle(event) |
128 | 113 | end
|
129 | 114 |
|
130 | 115 | function Base.run(listener, args...; host = nothing, port = nothing, kwargs...)
|
|
136 | 121 |
|
137 | 122 | function Base.run(listener::EventListener, host::HTTP.IPAddr, port::Int, args...; kwargs...)
|
138 | 123 | println("Listening for GitHub events sent to $port;")
|
139 |
| - println("Whitelisted events: $(isa(listener.events, Void) ? "All" : listener.events)") |
140 |
| - println("Whitelisted repos: $(isa(listener.repos, Void) ? "All" : listener.repos)") |
141 |
| - return HTTP.serve(listener.server, host, port, args...; kwargs...) |
| 124 | + println("Whitelisted events: $(isa(listener.events, Nothing) ? "All" : listener.events)") |
| 125 | + println("Whitelisted repos: $(isa(listener.repos, Nothing) ? "All" : listener.repos)") |
| 126 | + HTTP.listen(listener.handle_request, host, port; kwargs...) |
142 | 127 | end
|
143 | 128 |
|
144 | 129 | ###################
|
|
0 commit comments