ryotarai/infrataster

View on GitHub
lib/infrataster/resources/http_resource.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'infrataster/resources/base_resource'
require 'uri'

module Infrataster
  module Resources
    class HttpResource < BaseResource
      Error = Class.new(StandardError)

      attr_reader :uri, :options

      def initialize(url_str, options = {})
        @options = {params: {}, method: :get, headers: {}}.merge(options)
        @uri = URI.parse(url_str)
        if @uri.scheme
          unless %w!http https!.include?(@uri.scheme)
            raise Error, "The provided url, '#{@uri}', is not http or https."
          end
        else
          @uri = URI::HTTP.build([@uri.userinfo, @uri.host, @uri.port, @uri.path, @uri.query, @uri.fragment])
        end
      end

      def to_s
        "http '#{@uri}' with #{@options}"
      end

      def params
        @options[:params]
      end

      def method
        valid_methods = [:get, :head, :delete, :post, :put, :patch]
        unless valid_methods.include?(@options[:method])
          raise Error, "#{@options[:method]} is not supported HTTP method."
        end

        @options[:method]
      end

      def headers
        @options[:headers]
      end

      def body
        @options[:body]
      end

      def ssl_option
        @options[:ssl]
      end

      def basic_auth
        @options[:basic_auth]
      end

      def inflate_gzip?
        !!@options[:inflate_gzip]
      end

      def follow_redirects?
        !!@options[:follow_redirects]
      end

      def faraday_middlewares
        (@options[:faraday_middlewares] || []).map do |m|
          Array(m)
        end
      end

      def host_mapping
        @options[:host_mapping] || {}
      end
    end
  end
end