class Pubsubhubbub4r::Client

Constants

HTTP_TIMEOUT

Attributes

cache[RW]
headers[RW]
logger[RW]
post_data_overrides[RW]

Public Class Methods

new(cache, logger = nil, headers = nil, post_data_overrides = nil) click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 14
def initialize(cache, logger = nil, headers = nil, post_data_overrides = nil)
  # "cache" and "logger" must respond like Rails.cache / Rails.logger
  @cache = cache
  @logger = logger
  @headers = headers
  # e.g. {'hub.verify' => 'sync'}
  @post_data_overrides = post_data_overrides
end

Public Instance Methods

subscribe(hub_url, topic, callback_url, lease_seconds = 2592000, ack_timeout_seconds = 86400) click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 23
def subscribe(hub_url, topic, callback_url, lease_seconds = 2592000, ack_timeout_seconds = 86400)
  post('subscribe', hub_url, topic, callback_url, lease_seconds, ack_timeout_seconds)
end
unsubscribe(hub_url, topic, callback_url, lease_seconds = 2592000, ack_timeout_seconds = 86400) click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 27
def unsubscribe(hub_url, topic, callback_url, lease_seconds = 2592000, ack_timeout_seconds = 86400)
  post('unsubscribe', hub_url, topic, callback_url, lease_seconds, ack_timeout_seconds)
end
verify(params) click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 31
def verify(params)
  cache_key = verification_cache_key(params['hub.verify_token'])
  cached_secret = self.cache.read(cache_key)
  new_secret = verification_secret(params['hub.mode'], params['hub.topic'])
  self.logger.debug "verifying #{cache_key.inspect}: #{cached_secret.inspect} vs #{new_secret.inspect}" if self.logger
  if cached_secret && cached_secret == new_secret
    self.cache.delete(cache_key)
    params['hub.challenge']
  else
    false
  end
end

Protected Instance Methods

post(mode, hub_url, topic, callback_url, lease_seconds, ack_timeout_seconds) { |http| ... } click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 54
def post(mode, hub_url, topic, callback_url, lease_seconds, ack_timeout_seconds)
  verify_token = Digest::SHA1.hexdigest("#{[mode, topic, callback_url, lease_seconds, rand(ack_timeout_seconds), Time.now.to_f].join('.')}")
  cache_key = verification_cache_key(verify_token)
  self.cache.write(cache_key, verification_secret(mode, topic))
  uri = URI.parse(hub_url)
  request_headers = { 'User-Agent' => 'Pubsubhubbub4r::Client' }.merge(self.headers || {})
  request = Net::HTTP::Post.new(uri.request_uri, request_headers)
  request.form_data = {
    'hub.mode' => mode,
    'hub.callback' => callback_url,
    'hub.topic' => topic,
    'hub.verify_token' => verify_token,
    'hub.lease_seconds' => lease_seconds,
    'hub.verify' => 'async',
  }.merge(self.post_data_overrides || {})
  session = Net::HTTP.new(uri.host, uri.port)
  session.use_ssl = true if uri.scheme == "https"
  response = session.start do |http|
    http.read_timeout = HTTP_TIMEOUT
    yield http if block_given?
    http.request(request)
  end
  case response && response.code.to_s
  when "204"
    self.cache.delete(cache_key)
    self.logger.debug "#{mode} : verified" if self.logger
    lease_seconds
  when "202"
    self.logger.debug "#{mode} : accepted, verify later" if self.logger
    nil
  else
    raise "#{response.code} #{response.message} #{response.body}".strip
  end
end
verification_cache_key(verify_token) click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 46
def verification_cache_key(verify_token)
  "verify_token-#{verify_token}"
end
verification_secret(mode, topic) click to toggle source
# File lib/pubsubhubbub4r/client.rb, line 50
def verification_secret(mode, topic)
  [mode, topic].join("#")
end