120 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			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
 | 
						|
 | 
						|
    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 |