Sha256: ce452c5f0002a3d59755ddef2713868e7011d3fa1abd65a5aada57efd731dde5

Contents?: true

Size: 1.32 KB

Versions: 2

Compression:

Stored size: 1.32 KB

Contents

# frozen_string_literal: true

require 'websocket/driver'
require 'permessage_deflate'
require 'json'
require 'uri'

module Canari
  module CertStream
    attr_accessor :url

    def connection_completed
      @driver = WebSocket::Driver.client(self)
      @driver.add_extension(PermessageDeflate)
      attach_listeners
      @driver.start
    end

    def receive_data(data)
      @driver.parse(data)
    end

    def write(data)
      send_data(data)
    end

    def finalize(event)
      Canari.logger.info "Connection closed, #{event.code}: #{event.reason}"
      close_connection
      Canari.logger.info 'Reconnecting'
      reconnect(uri.host, 443)
    end

    def uri
      URI.parse(url)
    end

    def attach_listeners
      @driver.on(:open)    { |_event| Canari.logger.info 'Connection opened' }
      @driver.on(:message) do |event|
        handle_message(event.data)
      end
      @driver.on(:close) { |event| finalize(event) }
    end

    def handle_message(data)
      data = JSON.parse(data)
      return unless data['message_type'] == 'certificate_update'

      cert = data['data']['leaf_cert']
      matching_names = DomainCache.fetch(cert['all_domains'])
      return unless matching_names.any?

      Canari.logger.info "Certificate matching #{matching_names}"
      Notifier.notify(matching_names, data)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
canari-0.2.0 lib/canari/cert_stream.rb
canari-0.1.0 lib/canari/cert_stream.rb