class Translatomatic::HTTP::Client

HTTP client

Constants

MAX_REDIRECTS
RETRIABLE
RETRIABLE_CODES

Public Class Methods

new(options = {}) click to toggle source
# File lib/translatomatic/http/client.rb, line 7
def initialize(options = {})
  @redirects = 0
  @jar = ::HTTP::CookieJar.new
  @retry_delay = options[:retry_delay] || 2
end

Public Instance Methods

delete(url, options = {}) click to toggle source

Send an HTTP DELETE request @param url [String,URI] URL of the request @param options [Hash<Symbol,Object>] Request options @return [Net::HTTP::Response]

# File lib/translatomatic/http/client.rb, line 43
def delete(url, options = {})
  send_request_with_method(:delete, url, options)
end
get(url, query = nil, options = {}) click to toggle source

Send an HTTP GET request @param url [String,URI] URL of the request @param query [Hash<String,String>] Optional query parameters @param options [Hash<Symbol,Object>] Request options @return [Net::HTTP::Response]

# File lib/translatomatic/http/client.rb, line 18
def get(url, query = nil, options = {})
  send_request_with_method(:get, url, options.merge(query: query))
end
head(url, options = {}) click to toggle source

Send an HTTP HEAD request @param url [String,URI] URL of the request @param options [Hash<Symbol,Object>] Request options @return [Net::HTTP::Response]

# File lib/translatomatic/http/client.rb, line 35
def head(url, options = {})
  send_request_with_method(:head, url, options)
end
post(url, body, options = {}) click to toggle source

Send an HTTP POST request @param url [String,URI] URL of the request @param body [String,Hash] Body of the request @param options [Hash<Symbol,Object>] Request options @return [Net::HTTP::Response]

# File lib/translatomatic/http/client.rb, line 27
def post(url, body, options = {})
  send_request_with_method(:post, url, options.merge(body: body))
end
start(url, _options = {}) { |http| ... } click to toggle source

Start an HTTP request. Yields the http object. @param url [String,URI] URL of the request, requires host and port @return [Object] The result of the yielded block

# File lib/translatomatic/http/client.rb, line 50
def start(url, _options = {})
  uri = url.respond_to?(:host) ? url : URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = uri.scheme == 'https'
  # http.set_debug_output(Translatomatic.config.logger) if ENV['DEBUG']
  result = http.start do
    @http = http
    yield http
  end
  @http = nil
  result
end

Private Instance Methods

handle_response(response) click to toggle source
# File lib/translatomatic/http/client.rb, line 114
def handle_response(response)
  log.debug("HTTP response: #{response.code} #{response.msg}")

  case response
  when Net::HTTPSuccess
    @redirects = 0
    save_cookies(response)
    response
  when Net::HTTPRedirection
    @redirects += 1
    raise 'Maximum redirects exceeded' if @redirects > MAX_REDIRECTS
    new_uri = redirect_uri(response)
    get(new_uri, nil)
  else
    # error
    @redirects = 0
    raise Translatomatic::HTTP::Exception, response
  end
end
redirect_uri(response) click to toggle source
# File lib/translatomatic/http/client.rb, line 134
def redirect_uri(response)
  location = URI.parse(response['Location'])
  if location.relative?
    response.uri + response.location
  else
    location
  end
end
save_cookies(response) click to toggle source
# File lib/translatomatic/http/client.rb, line 108
def save_cookies(response)
  cookies = response.get_fields('set-cookie')
  return unless cookies
  cookies.each { |i| @jar.parse(i, response.uri) }
end
send_request(req) click to toggle source
# File lib/translatomatic/http/client.rb, line 94
def send_request(req)
  executor = HttpRetryExecutor.new(retry_delay: @retry_delay)
  executor.run { handle_response(send_request_http(req)) }
end
send_request_http(req) click to toggle source
# File lib/translatomatic/http/client.rb, line 99
def send_request_http(req)
  if @http
    log.debug("HTTP request: #{req.http_request.uri}")
    @http.request(req.http_request)
  else
    start(req.uri) { |_http| send_request_http(req) }
  end
end
send_request_with_method(method, url, options = {}) click to toggle source
# File lib/translatomatic/http/client.rb, line 87
def send_request_with_method(method, url, options = {})
  cookies = ::HTTP::Cookie.cookie_value(@jar.cookies(url))
  options = options.merge(cookies: cookies) if cookies.present?
  request = Request.new(method, url, options)
  send_request(request)
end