A library for handling DID identifiers used in Bluesky AT Protocol

extracted request making & handling redirects to a module

+37 -21
+28
lib/didkit/requests.rb
···
··· 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' 8 9 module DIDKit 10 class Resolver 11 RESERVED_DOMAINS = %w(alt arpa example internal invalid local localhost onion test) 12 MAX_REDIRECTS = 5 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) 54 55 + if response.is_a?(Net::HTTPSuccess) && (text = response.body) 56 + return parse_did_from_well_known(text) 57 end 58 59 nil