mirror of https://github.com/mastodon/goldfinger
Initial commit
This commit is contained in:
commit
724f0c6a80
|
@ -0,0 +1,3 @@
|
|||
--color
|
||||
--require spec_helper
|
||||
--format NyanCatFormatter
|
|
@ -0,0 +1,2 @@
|
|||
2.2.0
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
source "https://rubygems.org"
|
||||
|
||||
group :test do
|
||||
gem 'rspec', '>= 3.0'
|
||||
gem 'nyan-cat-formatter'
|
||||
gem 'webmock'
|
||||
end
|
||||
|
||||
gemspec
|
|
@ -0,0 +1,63 @@
|
|||
PATH
|
||||
remote: .
|
||||
specs:
|
||||
goldfinger (0.0.0)
|
||||
addressable (~> 2.4)
|
||||
http (~> 1.0)
|
||||
nokogiri (~> 1.6)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
addressable (2.4.0)
|
||||
crack (0.4.3)
|
||||
safe_yaml (~> 1.0.0)
|
||||
diff-lcs (1.2.5)
|
||||
domain_name (0.5.20160128)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
hashdiff (0.3.0)
|
||||
http (1.0.2)
|
||||
addressable (~> 2.3)
|
||||
http-cookie (~> 1.0)
|
||||
http-form_data (~> 1.0.1)
|
||||
http_parser.rb (~> 0.6.0)
|
||||
http-cookie (1.0.2)
|
||||
domain_name (~> 0.5)
|
||||
http-form_data (1.0.1)
|
||||
http_parser.rb (0.6.0)
|
||||
mini_portile2 (2.0.0)
|
||||
nokogiri (1.6.7.2)
|
||||
mini_portile2 (~> 2.0.0.rc2)
|
||||
nyan-cat-formatter (0.11)
|
||||
rspec (>= 2.99, >= 2.14.2, < 4)
|
||||
rspec (3.4.0)
|
||||
rspec-core (~> 3.4.0)
|
||||
rspec-expectations (~> 3.4.0)
|
||||
rspec-mocks (~> 3.4.0)
|
||||
rspec-core (3.4.2)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-expectations (3.4.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-mocks (3.4.1)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.4.0)
|
||||
rspec-support (3.4.1)
|
||||
safe_yaml (1.0.4)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.7.2)
|
||||
webmock (1.22.6)
|
||||
addressable (>= 2.3.6)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
bundler (~> 1.3)
|
||||
goldfinger!
|
||||
nyan-cat-formatter
|
||||
rspec (>= 3.0)
|
||||
webmock
|
|
@ -0,0 +1,20 @@
|
|||
Gem::Specification.new do |s|
|
||||
s.name = 'goldfinger'
|
||||
s.version = '0.0.0'
|
||||
s.platform = Gem::Platform::RUBY
|
||||
s.required_ruby_version = '>= 2.0.0'
|
||||
s.date = '2016-02-17'
|
||||
s.summary = "A Webfinger utility for Ruby"
|
||||
s.description = "A Webfinger utility for Ruby"
|
||||
s.authors = ["Eugen Rochko"]
|
||||
s.email = 'eugen@zeonfederated.com'
|
||||
s.files = `git ls-files lib LICENSE README.md`.split($RS)
|
||||
s.homepage = 'https://github.com/Gargron/goldfinger'
|
||||
s.license = 'MIT'
|
||||
|
||||
s.add_dependency('http', '~> 1.0')
|
||||
s.add_dependency('addressable', '~> 2.4')
|
||||
s.add_dependency('nokogiri', '~> 1.6')
|
||||
|
||||
s.add_development_dependency('bundler', '~> 1.3')
|
||||
end
|
|
@ -0,0 +1,15 @@
|
|||
require 'goldfinger/request'
|
||||
require 'goldfinger/result'
|
||||
require 'goldfinger/utils'
|
||||
require 'goldfinger/client'
|
||||
|
||||
module Goldfinger
|
||||
module Error
|
||||
class NotFound < StandardError
|
||||
end
|
||||
end
|
||||
|
||||
def self.finger(uri)
|
||||
Goldfinger::Client.new(uri).finger
|
||||
end
|
||||
end
|
|
@ -0,0 +1,38 @@
|
|||
require 'addressable'
|
||||
require 'nokogiri'
|
||||
|
||||
module Goldfinger
|
||||
class Client
|
||||
include Goldfinger::Utils
|
||||
|
||||
def initialize(uri)
|
||||
@uri = uri
|
||||
end
|
||||
|
||||
def finger
|
||||
_, template = perform_get(url)
|
||||
headers, body = perform_get(url_from_template(template))
|
||||
Goldfinger::Result.new(headers, body)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def url(ssl = true)
|
||||
"http#{'s' if ssl}://#{domain}/.well-known/host-meta"
|
||||
end
|
||||
|
||||
def url_from_template(template)
|
||||
xml = Nokogiri::XML(template)
|
||||
links = xml.xpath('//xmlns:Link[@rel="lrdd"]', xmlns: 'http://docs.oasis-open.org/ns/xri/xrd-1.0')
|
||||
|
||||
raise Goldfinger::Error::NotFound if links.empty?
|
||||
|
||||
url = Addressable::Template.new(links.first.attribute('template').value)
|
||||
url.expand({ uri: @uri }).to_s
|
||||
end
|
||||
|
||||
def domain
|
||||
@uri.split('@').last
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,23 @@
|
|||
require 'http'
|
||||
require 'addressable'
|
||||
|
||||
module Goldfinger
|
||||
class Request
|
||||
def initialize(request_method, path, options = {})
|
||||
@request_method = request_method
|
||||
@uri = Addressable::URI.parse(path)
|
||||
@options = options
|
||||
end
|
||||
|
||||
def perform
|
||||
response = http_client.request(@request_method, @uri.to_s, @options)
|
||||
[response.headers, response.body]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def http_client
|
||||
HTTP
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,40 @@
|
|||
module Goldfinger
|
||||
class Result
|
||||
def initialize(headers, body)
|
||||
@mime_type = headers.get(HTTP::Headers::CONTENT_TYPE).first
|
||||
@body = body
|
||||
@links = {}
|
||||
|
||||
parse
|
||||
end
|
||||
|
||||
def links
|
||||
@links.to_a
|
||||
end
|
||||
|
||||
def link(rel)
|
||||
@links[rel]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse
|
||||
case @mime_type
|
||||
when 'application/jrd+json'
|
||||
parse_json
|
||||
when 'application/xrd+xml'
|
||||
parse_xml
|
||||
end
|
||||
end
|
||||
|
||||
def parse_json
|
||||
json = JSON.parse(@body)
|
||||
json['links'].each { |link| @links[link['rel']] = link['href'] }
|
||||
end
|
||||
|
||||
def parse_xml
|
||||
xml = Nokogiri::XML(@body)
|
||||
xml.xpath('//xmlns:Link', xmlns: 'http://docs.oasis-open.org/ns/xri/xrd-1.0').each { |link| @links[link.attribute('rel').value] = link.attribute('href').value }
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,11 @@
|
|||
module Goldfinger
|
||||
module Utils
|
||||
def perform_get(path, options = {})
|
||||
perform_request(:get, path, options)
|
||||
end
|
||||
|
||||
def perform_request(request_method, path, options = {})
|
||||
Goldfinger::Request.new(request_method, path, options).perform
|
||||
end
|
||||
end
|
||||
end
|
|
@ -0,0 +1,5 @@
|
|||
describe Goldfinger::Client do
|
||||
describe '#finger' do
|
||||
pending
|
||||
end
|
||||
end
|
|
@ -0,0 +1,5 @@
|
|||
describe Goldfinger::Request do
|
||||
describe '#perform' do
|
||||
pending
|
||||
end
|
||||
end
|
|
@ -0,0 +1,17 @@
|
|||
describe Goldfinger::Result do
|
||||
describe '#links' do
|
||||
pending
|
||||
end
|
||||
|
||||
describe '#link' do
|
||||
pending
|
||||
end
|
||||
|
||||
describe '#parse_xml' do
|
||||
pending
|
||||
end
|
||||
|
||||
describe '#parse_json' do
|
||||
pending
|
||||
end
|
||||
end
|
|
@ -0,0 +1,3 @@
|
|||
describe Goldfinger::Utils do
|
||||
pending
|
||||
end
|
|
@ -0,0 +1,16 @@
|
|||
require 'goldfinger'
|
||||
require 'webmock/rspec'
|
||||
|
||||
WebMock.disable_net_connect!
|
||||
|
||||
RSpec.configure do |config|
|
||||
|
||||
config.expect_with :rspec do |expectations|
|
||||
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
||||
end
|
||||
|
||||
config.mock_with :rspec do |mocks|
|
||||
mocks.verify_partial_doubles = true
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue