goldfinger/lib/goldfinger/client.rb

62 lines
1.4 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2016-02-17 15:13:19 +01:00
require 'addressable'
require 'nokogiri'
module Goldfinger
class Client
include Goldfinger::Utils
def initialize(uri)
@uri = uri
end
def finger
response = perform_get(standard_url)
return finger_from_template if response.code != 200
Goldfinger::Result.new(response)
rescue Addressable::URI::InvalidURIError
raise Goldfinger::NotFoundError, 'Invalid URI'
2016-02-17 15:13:19 +01:00
end
private
def finger_from_template
template = perform_get(url)
raise Goldfinger::NotFoundError, 'No host-meta on the server' if template.code != 200
response = perform_get(url_from_template(template.body))
raise Goldfinger::NotFoundError, 'No such user on the server' if response.code != 200
Goldfinger::Result.new(response)
end
def url
"https://#{domain}/.well-known/host-meta"
2016-02-17 15:13:19 +01:00
end
def standard_url
"https://#{domain}/.well-known/webfinger?resource=#{@uri}"
end
2016-02-17 15:13:19 +01:00
def url_from_template(template)
xml = Nokogiri::XML(template)
links = xml.xpath('//xmlns:Link[@rel="lrdd"]')
2016-02-17 15:13:19 +01:00
raise Goldfinger::NotFoundError if links.empty?
2016-02-17 15:13:19 +01:00
links.first.attribute('template').value.gsub('{uri}', @uri)
2016-09-30 23:06:11 +02:00
rescue Nokogiri::XML::XPath::SyntaxError
raise Goldfinger::Error, "Bad XML: #{template}"
2016-02-17 15:13:19 +01:00
end
def domain
@uri.split('@').last
end
end
end