mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-16 17:55:56 +08:00
新增:webhook service
This commit is contained in:
92
app/services/webhook/client.rb
Normal file
92
app/services/webhook/client.rb
Normal file
@@ -0,0 +1,92 @@
|
||||
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
|
||||
attr_accessor :request_content, :response_content
|
||||
|
||||
def initialize(opts)
|
||||
@uuid = opts[:uuid]
|
||||
@event = opts[:event]
|
||||
@http_method = opts[:http_method]
|
||||
@content_type = opts[:content_type]
|
||||
@url = opts[:url]
|
||||
@secret = opts[:secret]
|
||||
@payload_content = opts[:payload_content]
|
||||
@request_content = {}
|
||||
@response_content = {}
|
||||
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: payload_content) {|response, request, result| response }
|
||||
|
||||
@response_content["status"] = response.code
|
||||
@response_content["headers"] = response.headers
|
||||
@response_content["body"] = response.body.to_json
|
||||
|
||||
return @request_content, @response_content
|
||||
end
|
||||
|
||||
def request_content
|
||||
@request_content
|
||||
end
|
||||
|
||||
def response_content
|
||||
@response_content
|
||||
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
|
||||
Reference in New Issue
Block a user