lib/webmention/verification/client.rb in webmention-verification-2.0.0 vs lib/webmention/verification/client.rb in webmention-verification-3.0.0

- old
+ new

@@ -1,10 +1,30 @@ module Webmention module Verification class Client + HTTP_CLIENT_HEADERS = { + accept: '*/*', + user_agent: 'Webmention Verification Client (https://rubygems.org/gems/webmention-verification)' + }.freeze + attr_reader :source, :target + # Create a client used to determine whether or not source URI links to target URI. + # + # @example + # source = 'https://source.example.com/post/100' + # target = 'https://target.example.com/post/100' + # + # client = Webmention::Verification::Client.new(source, target) + # + # puts client.verified? + # #=> TrueClass or FalseClass + # + # @param source [String] + # @param target [String] + # @param options [Hash] + # @option options [Boolean] :strict (true) def initialize(source, target, **options) raise ArgumentError, "source must be a String (given #{source.class.name})" unless source.is_a?(String) raise ArgumentError, "target must be a String (given #{target.class.name})" unless target.is_a?(String) @source = source @@ -13,25 +33,37 @@ raise ArgumentError, 'source must be an absolute URI (e.g. https://example.com/post/100)' unless source_uri.absolute? raise ArgumentError, 'target must be an absolute URI (e.g. https://example.com/post/100)' unless target_uri.absolute? end + # @return [HTTP::Response] + # @raise [Webmention::Verification::ConnectionError, Webmention::Verification::TimeoutError, Webmention::Verification::TooManyRedirectsError] def response - @response ||= HttpRequest.get(source_uri) + @response ||= HTTP.follow.headers(HTTP_CLIENT_HEADERS).timeout(connect: 10, read: 10).get(source_uri) + rescue HTTP::ConnectionError, + HTTP::TimeoutError, + HTTP::Redirector::TooManyRedirectsError => exception + raise Webmention::Verification.const_get(exception.class.name.split('::').last), exception end + # @return [Addressable::URI] + # @raise [Webmention::Verification::InvalidURIError] def source_uri @source_uri ||= Addressable::URI.parse(source) rescue Addressable::URI::InvalidURIError => exception raise InvalidURIError, exception end + # @return [Addressable::URI] + # @raise [Webmention::Verification::InvalidURIError] def target_uri @target_uri ||= Addressable::URI.parse(target) rescue Addressable::URI::InvalidURIError => exception raise InvalidURIError, exception end + # @return [Boolean] + # @raise [Webmention::Verification::UnsupportedMimeTypeError] def verified? raise UnsupportedMimeTypeError, "Unsupported MIME Type: #{response.mime_type}" unless verifier_for_mime_type verifier_for_mime_type.new(response, target, @options).verified? end