From 737eda0d91e8a3d640909f00e9312081db3d49a1 Mon Sep 17 00:00:00 2001 From: Kuba Suder Date: Fri, 29 Mar 2024 23:04:16 +0200 Subject: [PATCH] extracted request making & handling redirects to a module --- lib/didkit/requests.rb | 28 ++++++++++++++++++++++++++++ lib/didkit/resolver.rb | 30 +++++++++--------------------- 2 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 lib/didkit/requests.rb diff --git a/lib/didkit/requests.rb b/lib/didkit/requests.rb new file mode 100644 index 0000000..820efe1 --- /dev/null +++ b/lib/didkit/requests.rb @@ -0,0 +1,28 @@ +module DIDKit::Requests + def get_response(url, options = {}) + url = URI(url) unless url.is_a?(URI) + request_options = { use_ssl: true } + + if timeout = options[:timeout] + request_options[:open_timeout] = timeout + request_options[:read_timeout] = timeout + end + + redirects = 0 + max_redirects = options[:max_redirects] || 0 + + loop do + response = Net::HTTP.start(url.host, url.port, request_options) do |http| + request = Net::HTTP::Get.new(url) + http.request(request) + end + + if response.is_a?(Net::HTTPRedirection) && redirects < max_redirects && (location = response['Location']) + url = URI(location.include?('://') ? location : (url.origin + location)) + redirects += 1 + else + return response + end + end + end +end diff --git a/lib/didkit/resolver.rb b/lib/didkit/resolver.rb index 48d5932..23a39d6 100644 --- a/lib/didkit/resolver.rb +++ b/lib/didkit/resolver.rb @@ -5,12 +5,15 @@ require 'resolv' require_relative 'did' require_relative 'document' +require_relative 'requests' module DIDKit class Resolver RESERVED_DOMAINS = %w(alt arpa example internal invalid local localhost onion test) MAX_REDIRECTS = 5 + include Requests + attr_accessor :nameserver def initialize(options = {}) @@ -32,9 +35,9 @@ module DIDKit end def resolve_handle_by_dns(domain) - dns_records = Resolv::DNS.open(resolv_options) { |d| + dns_records = Resolv::DNS.open(resolv_options) do |d| d.getresources("_atproto.#{domain}", Resolv::DNS::Resource::IN::TXT) - } + end if record = dns_records.first if string = record.strings.first @@ -46,26 +49,11 @@ module DIDKit end def resolve_handle_by_well_known(domain) - resolve_handle_from_url("https://#{domain}/.well-known/atproto-did") - end - - def resolve_handle_from_url(url, redirects = 0) - url = URI(url) unless url.is_a?(URI) + url = "https://#{domain}/.well-known/atproto-did" + response = get_response(url, timeout: 10, max_redirects: MAX_REDIRECTS) - response = Net::HTTP.start(url.host, url.port, use_ssl: true, open_timeout: 10, read_timeout: 10) do |http| - request = Net::HTTP::Get.new(url) - http.request(request) - end - - if response.is_a?(Net::HTTPSuccess) - if text = response.body - return parse_did_from_well_known(text) - end - elsif response.is_a?(Net::HTTPRedirection) && redirects < MAX_REDIRECTS - if location = response['Location'] - target_url = location.include?('://') ? location : (url.origin + location) - return resolve_handle_from_url(target_url, redirects + 1) - end + if response.is_a?(Net::HTTPSuccess) && (text = response.body) + return parse_did_from_well_known(text) end nil -- knotmirror 0.0.1