tangled
alpha
login
or
join now
mackuba.eu
/
didkit
1
fork
atom
A library for handling DID identifiers used in Bluesky AT Protocol
1
fork
atom
overview
issues
pulls
pipelines
extracted request making & handling redirects to a module
mackuba.eu
2 years ago
737eda0d
8a787791
+37
-21
2 changed files
expand all
collapse all
unified
split
lib
didkit
requests.rb
resolver.rb
+28
lib/didkit/requests.rb
···
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
···
1
+
module DIDKit::Requests
2
+
def get_response(url, options = {})
3
+
url = URI(url) unless url.is_a?(URI)
4
+
request_options = { use_ssl: true }
5
+
6
+
if timeout = options[:timeout]
7
+
request_options[:open_timeout] = timeout
8
+
request_options[:read_timeout] = timeout
9
+
end
10
+
11
+
redirects = 0
12
+
max_redirects = options[:max_redirects] || 0
13
+
14
+
loop do
15
+
response = Net::HTTP.start(url.host, url.port, request_options) do |http|
16
+
request = Net::HTTP::Get.new(url)
17
+
http.request(request)
18
+
end
19
+
20
+
if response.is_a?(Net::HTTPRedirection) && redirects < max_redirects && (location = response['Location'])
21
+
url = URI(location.include?('://') ? location : (url.origin + location))
22
+
redirects += 1
23
+
else
24
+
return response
25
+
end
26
+
end
27
+
end
28
+
end
+9
-21
lib/didkit/resolver.rb
···
5
6
require_relative 'did'
7
require_relative 'document'
0
8
9
module DIDKit
10
class Resolver
11
RESERVED_DOMAINS = %w(alt arpa example internal invalid local localhost onion test)
12
MAX_REDIRECTS = 5
0
0
13
14
attr_accessor :nameserver
15
···
32
end
33
34
def resolve_handle_by_dns(domain)
35
-
dns_records = Resolv::DNS.open(resolv_options) { |d|
36
d.getresources("_atproto.#{domain}", Resolv::DNS::Resource::IN::TXT)
37
-
}
38
39
if record = dns_records.first
40
if string = record.strings.first
···
46
end
47
48
def resolve_handle_by_well_known(domain)
49
-
resolve_handle_from_url("https://#{domain}/.well-known/atproto-did")
50
-
end
51
-
52
-
def resolve_handle_from_url(url, redirects = 0)
53
-
url = URI(url) unless url.is_a?(URI)
54
-
55
-
response = Net::HTTP.start(url.host, url.port, use_ssl: true, open_timeout: 10, read_timeout: 10) do |http|
56
-
request = Net::HTTP::Get.new(url)
57
-
http.request(request)
58
-
end
59
60
-
if response.is_a?(Net::HTTPSuccess)
61
-
if text = response.body
62
-
return parse_did_from_well_known(text)
63
-
end
64
-
elsif response.is_a?(Net::HTTPRedirection) && redirects < MAX_REDIRECTS
65
-
if location = response['Location']
66
-
target_url = location.include?('://') ? location : (url.origin + location)
67
-
return resolve_handle_from_url(target_url, redirects + 1)
68
-
end
69
end
70
71
nil
···
5
6
require_relative 'did'
7
require_relative 'document'
8
+
require_relative 'requests'
9
10
module DIDKit
11
class Resolver
12
RESERVED_DOMAINS = %w(alt arpa example internal invalid local localhost onion test)
13
MAX_REDIRECTS = 5
14
+
15
+
include Requests
16
17
attr_accessor :nameserver
18
···
35
end
36
37
def resolve_handle_by_dns(domain)
38
+
dns_records = Resolv::DNS.open(resolv_options) do |d|
39
d.getresources("_atproto.#{domain}", Resolv::DNS::Resource::IN::TXT)
40
+
end
41
42
if record = dns_records.first
43
if string = record.strings.first
···
49
end
50
51
def resolve_handle_by_well_known(domain)
52
+
url = "https://#{domain}/.well-known/atproto-did"
53
+
response = get_response(url, timeout: 10, max_redirects: MAX_REDIRECTS)
0
0
0
0
0
0
0
0
54
55
+
if response.is_a?(Net::HTTPSuccess) && (text = response.body)
56
+
return parse_did_from_well_known(text)
0
0
0
0
0
0
0
57
end
58
59
nil