module HTTPI

HTTPI

Executes HTTP requests using a predefined adapter. All request methods accept an HTTPI::Request and an optional adapter. They may also offer shortcut methods for executing basic requests. Also they all return an HTTPI::Response.

GET

request = HTTPI::Request.new("http://example.com")
HTTPI.get(request, :httpclient)

Shortcuts

HTTPI.get("http://example.com", :curb)

POST

request = HTTPI::Request.new
request.url = "http://example.com"
request.body = "<some>xml</some>"

HTTPI.post(request, :httpclient)

Shortcuts

HTTPI.post("http://example.com", "<some>xml</some>", :curb)

HEAD

request = HTTPI::Request.new("http://example.com")
HTTPI.head(request, :httpclient)

Shortcuts

HTTPI.head("http://example.com", :curb)

PUT

request = HTTPI::Request.new
request.url = "http://example.com"
request.body = "<some>xml</some>"

HTTPI.put(request, :httpclient)

Shortcuts

HTTPI.put("http://example.com", "<some>xml</some>", :curb)

DELETE

request = HTTPI::Request.new("http://example.com")
HTTPI.delete(request, :httpclient)

Shortcuts

HTTPI.delete("http://example.com", :curb)

More control

If you need more control over your request, you can access the HTTP client instance represented by your adapter in a block.

HTTPI.get request do |http|
  http.follow_redirect_count = 3  # HTTPClient example
end

mostly verbatim from: github.com/rack/rack/blob/main/lib/rack/headers.rb Because this is part of httpi’s public API, its better not to load an external library for it.

Constants

DEFAULT_LOG_LEVEL
DimeRecord
REQUEST_METHODS
VERSION

Attributes

log[W]

Sets whether to log HTTP requests.

log_level[W]

Sets the log level.

logger[W]

Sets the logger to use.

Public Class Methods

adapter=(adapter) click to toggle source

Shortcut for setting the default adapter to use.

# File lib/httpi.rb, line 175
def adapter=(adapter)
  Adapter.use = adapter
end
adapter_client_setup=(block) click to toggle source
# File lib/httpi.rb, line 179
def adapter_client_setup=(block)
  Adapter.client_setup_block = block
end
delete(request, adapter = nil, &block) click to toggle source

Executes an HTTP DELETE request.

# File lib/httpi.rb, line 150
def delete(request, adapter = nil, &block)
  request = Request.new(request) if request.kind_of? String
  request(:delete, request, adapter, &block)
end
get(request, adapter = nil, &block) click to toggle source

Executes an HTTP GET request.

# File lib/httpi.rb, line 126
def get(request, adapter = nil, &block)
  request = Request.new(request) if request.kind_of? String
  request(:get, request, adapter, &block)
end
head(request, adapter = nil, &block) click to toggle source

Executes an HTTP HEAD request.

# File lib/httpi.rb, line 138
def head(request, adapter = nil, &block)
  request = Request.new(request) if request.kind_of? String
  request(:head, request, adapter, &block)
end
log(message) click to toggle source

Logs a given message.

# File lib/httpi/logger.rb, line 32
def log(message)
  logger.send(log_level, message) if log?
end
log?() click to toggle source

Returns whether to log HTTP requests. Defaults to true.

# File lib/httpi/logger.rb, line 11
def log?
  @log != false
end
log_level() click to toggle source

Returns the log level. Defaults to :debug.

# File lib/httpi/logger.rb, line 27
def log_level
  @log_level ||= DEFAULT_LOG_LEVEL
end
logger() click to toggle source

Returns the logger. Defaults to an instance of Logger writing to STDOUT.

# File lib/httpi/logger.rb, line 19
def logger
  @logger ||= ::Logger.new($stdout)
end
post(*args, &block) click to toggle source

Executes an HTTP POST request.

# File lib/httpi.rb, line 132
def post(*args, &block)
  request, adapter = request_and_adapter_from(args)
  request(:post, request, adapter, &block)
end
put(*args, &block) click to toggle source

Executes an HTTP PUT request.

# File lib/httpi.rb, line 144
def put(*args, &block)
  request, adapter = request_and_adapter_from(args)
  request(:put, request, adapter, &block)
end
query_builder() click to toggle source
# File lib/httpi.rb, line 106
def query_builder
  @query_builder ||= HTTPI::QueryBuilder::Flat
end
query_builder=(builder) click to toggle source
# File lib/httpi.rb, line 110
def query_builder=(builder)
  if builder.is_a?(Symbol)
    builder_name = builder.to_s.capitalize
    begin
      builder = HTTPI::QueryBuilder.const_get(builder_name)
    rescue NameError
      raise ArgumentError, "Invalid builder. Available builders are: [:flat, :nested]"
    end
  end
  unless builder.respond_to?(:build)
    raise ArgumentError, "Query builder object should respond to build method"
  end
  @query_builder = builder
end
request(method, request, adapter = nil, redirects = 0) { |client| ... } click to toggle source

Executes an HTTP request for the given method.

# File lib/httpi.rb, line 156
def request(method, request, adapter = nil, redirects = 0)
  adapter_class = load_adapter(adapter, request)
  
  Adapter.client_setup_block.call(adapter_class.client) if Adapter.client_setup_block
  yield adapter_class.client if block_given?
  log_request(method, request, Adapter.identify(adapter_class.class))

  response = adapter_class.request(method)

  if response && HTTPI::Response::RedirectResponseCodes.member?(response.code) && request.follow_redirect? && redirects < request.redirect_limit
    request.url = URI.join(request.url, response.headers['location'])
    log("Following redirect: '#{request.url}'.")
    return request(method, request, adapter, redirects + 1)
  end

  response
end
reset_config!() click to toggle source

Reset the default config.

# File lib/httpi/logger.rb, line 37
def reset_config!
  @log = nil
  @logger = nil
  @log_level = nil
end

Protected Class Methods

log_request(method, request, adapter) click to toggle source
# File lib/httpi/logger.rb, line 45
def log_request(method, request, adapter)
  log("HTTPI #{request_ssl_info(request)} #{method.to_s.upcase} request to #{request.url.host} (#{adapter})")
end
request_ssl_info(request) click to toggle source
# File lib/httpi/logger.rb, line 49
def request_ssl_info(request)
  if request.auth && request.auth.ssl
    "#{request.auth.ssl.ssl_version}/#{request.auth.ssl.verify_mode}"
  end
end

Private Class Methods

load_adapter(adapter, request) click to toggle source
# File lib/httpi.rb, line 190
def load_adapter(adapter, request)
  Adapter.load(adapter).new(request)
end
request_and_adapter_from(args) click to toggle source
# File lib/httpi.rb, line 185
def request_and_adapter_from(args)
  return args if args[0].kind_of? Request
  [Request.new(:url => args[0], :body => args[1]), args[2]]
end