83 lines
3.0 KiB
Ruby
83 lines
3.0 KiB
Ruby
|
require 'httpclient'
|
||
|
require 'hurley'
|
||
|
require 'hurley/client'
|
||
|
|
||
|
module Google
|
||
|
module Apis
|
||
|
module Core
|
||
|
# HTTPClient adapter for Hurley.
|
||
|
class HttpClientAdapter
|
||
|
|
||
|
def call(request)
|
||
|
client = ::HTTPClient.new
|
||
|
configure_client(client, request)
|
||
|
|
||
|
begin
|
||
|
::Hurley::Response.new(request) do |res|
|
||
|
http_res = client.request(request.verb.to_s.upcase, request.url.to_s, nil, request.body_io, request.header.to_hash, false) do |http_res, chunk|
|
||
|
copy_response(http_res, res)
|
||
|
res.receive_body(chunk)
|
||
|
end
|
||
|
copy_response(http_res, res)
|
||
|
end
|
||
|
rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT
|
||
|
raise ::Hurley::Timeout, $!
|
||
|
rescue ::HTTPClient::BadResponseError => err
|
||
|
if err.message.include?('status 407')
|
||
|
raise ::Hurley::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
||
|
else
|
||
|
raise Hurley::ClientError, $!
|
||
|
end
|
||
|
rescue Errno::ECONNREFUSED, EOFError
|
||
|
raise ::Hurley::ConnectionFailed, $!
|
||
|
rescue => err
|
||
|
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
||
|
raise Hurley::SSLError, err
|
||
|
else
|
||
|
raise
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def copy_response(http_res, res)
|
||
|
unless res.status_code
|
||
|
res.status_code = http_res.status.to_i
|
||
|
http_res.header.all.each do |(k,v)|
|
||
|
res.header[k] = v
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def configure_client(client, request)
|
||
|
client.transparent_gzip_decompression = true
|
||
|
if request.options.proxy
|
||
|
proxy = request.options.proxy
|
||
|
client.proxy = sprintf('%s:%d', proxy.host, proxy.port)
|
||
|
if proxy.user && proxy.password
|
||
|
client.set_proxy_auth proxy.user, proxy.password
|
||
|
end
|
||
|
end
|
||
|
if request.options.timeout
|
||
|
client.connect_timeout = request.options.timeout
|
||
|
client.receive_timeout = request.options.timeout
|
||
|
client.send_timeout = request.options.timeout
|
||
|
end
|
||
|
if request.options.open_timeout
|
||
|
client.connect_timeout = request.options.open_timeout
|
||
|
client.send_timeout = request.options.open_timeout
|
||
|
end
|
||
|
ssl_config = client.ssl_config
|
||
|
ssl_opts = request.ssl_options
|
||
|
ssl_config.verify_mode = ssl_opts.openssl_verify_mode
|
||
|
ssl_config.cert_store = ssl_opts.openssl_cert_store
|
||
|
ssl_config.add_trust_ca ssl_opts.ca_file if ssl_opts.ca_file
|
||
|
ssl_config.add_trust_ca ssl_opts.ca_path if ssl_opts.ca_path
|
||
|
ssl_config.client_cert = ssl_opts.openssl_client_cert if ssl_opts.openssl_client_cert
|
||
|
ssl_config.client_key = ssl_opts.openssl_client_key if ssl_opts.openssl_client_key
|
||
|
ssl_config.verify_depth = ssl_opts.verify_depth if ssl_opts.verify_depth
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|