Sha256: cac305cf67f26c0be9da5534c32d4a4913ed660ad5aa0b45fc5619cd71f25854

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

require 'openssl/better_defaults'
require 'net/https'

class Okay
  module HTTP
    MethodError = Class.new(ArgumentError)
    RedirectLimitError = Class.new(StandardError)

    DEFAULT_REDIRECT_LIMIT = 10

    # A mapping of HTTP request methods to Net::HTTP methods.
    # (Yay overlapping terminology.)
    #
    # Also, what are consistent APIs even?
    METHODS = {
      get:  'get_response',
      post: 'post_form',
    }

    def self.get(url, parameters = {})
      send_request(METHODS[:get], url, parameters)
    end

    def self.post(url, parameters = {})
      send_request(METHODS[:post], url, parameters)
    end

    private

    def self.send_request(http_method, url, parameters, limit = DEFAULT_REDIRECT_LIMIT)
      if limit <= 0
        raise RedirectLimitError, "request exceeded redirect limit"
      end

      uri = URI.parse(url)
      uri.query = URI.encode_www_form(parameters)

      options = { use_ssl: (uri.scheme == 'https') }

      Net::HTTP.start(uri.host, uri.port, options) do |http|
        response = Net::HTTP.send(http_method, uri)

        case response
        when Net::HTTPSuccess
          response
        when Net::HTTPRedirection
          send_request(METHODS[:get], response['location'], parameters, limit - 1)
        else
          # This seemingly-innocent method raises an exception if the request
          # isn't successful.
          response.value
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
okay-1.0.0 lib/okay/http.rb