|
- 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
-
- 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
-
- @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
|