gitlink-forgeplus/app/services/webhook/client.rb

120 lines
3.3 KiB
Ruby

module Webhook::Client
# uuid SecureRandom.uuid
# hmac = OpenSSL::HMAC.new(secret, OpenSSL::Digest::SHA1.new)
# message = Gitea::WebhookTask.last.read_attribute_before_type_cast("payload_content")
# hmac.update(message)
# sha1 = hmac.digest.unpack('H*').first
attr_reader :uuid, :event, :http_method, :content_type, :url, :secret, :payload_content, :webhook
attr_accessor :request_content, :response_content, :webhook_task
def initialize(opts)
@uuid = opts[:uuid]
@event = opts[:event]
@webhook = opts[:webhook]
@http_method = @webhook.http_method
@content_type = @webhook.content_type
@url = @webhook.url
@secret = @webhook.secret
@payload_content = opts[:payload_content]
@request_content = {}
@response_content = {}
@webhook_task = Gitea::WebhookTask.create(
hook_id: @webhook.id,
uuid: @uuid,
payload_content: @payload_content,
event_type: @event,
is_delivered: true
)
end
def do_request
headers = {}
headers['Content-Type'] = trans_content_type
headers["X-Gitea-Delivery"] = @uuid
headers["X-Gitea-Event"] = @event
headers["X-Gitea-Event-Type"] = @event
headers["X-Gitea-Signature"] = signatureSHA256
headers["X-Gogs-Delivery"] = @uuid
headers["X-Gogs-Event"] = @event
headers["X-Gogs-Event-Type"] = @event
headers["X-Gogs-Signature"] = signatureSHA256
headers["X-Hub-Signature"] = "sha1=" + signatureSHA1
headers["X-Hub-Signature-256"] = "sha256=" + signatureSHA256
headers["X-GitHub-Delivery"] = @uuid
headers["X-GitHub-Event"] = @event
headers["X-GitHub-Event-Type"] = @event
@request_content["url"] = @url
@request_content["http_method"] = @http_method
@request_content["headers"] = headers
begin
response = RestClient::Request.execute(method: trans_http_method, url: @url, headers: headers, payload: @webhook_task.read_attribute_before_type_cast("payload_content")) {|response, request, result| response }
@response_content["status"] = response.code
@response_content["headers"] = response.headers
@response_content["body"] = response.body.to_json
rescue => e
@response_content["status"] = 500
@response_content["headers"] = {}
@response_content["body"] = e.message
end
@webhook_task.update_attributes({
delivered: Time.now.to_i * 1000000000,
is_succeed: @response_content["status"] < 300,
request_content: @request_content,
response_content: @response_content
})
return @request_content, @response_content, @webhook_task
end
def request_content
@request_content
end
def response_content
@response_content
end
def webhook_task
@webhook_task
end
private
def signatureSHA1
hmac = OpenSSL::HMAC.new(@secret, OpenSSL::Digest::SHA1.new)
message = @payload_content
hmac.digest.unpack('H*').first
end
def signatureSHA256
hmac = OpenSSL::HMAC.new(@secret, OpenSSL::Digest::SHA256.new)
message = @payload_content
hmac.digest.unpack('H*').first
end
def trans_content_type
if @content_type == "form"
return "application/x-www-form-urlencoded"
else
return "application/json"
end
end
def trans_http_method
if @http_method == "GET"
return :get
else
return :post
end
end
end