def transmit uri, req, payload, & block
setup_credentials req
net = net_http_class.new(uri.host, uri.port)
net.use_ssl = uri.is_a?(URI::HTTPS)
if @verify_ssl
if @verify_ssl.is_a? Integer
net.verify_mode = @verify_ssl
else
net.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
else
net.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
net.cert = @ssl_client_cert if @ssl_client_cert
net.key = @ssl_client_key if @ssl_client_key
net.ca_file = @ssl_ca_file if @ssl_ca_file
net.read_timeout = @timeout if @timeout
net.open_timeout = @open_timeout if @open_timeout
net.read_timeout = nil if @timeout == -1
net.open_timeout = nil if @open_timeout == -1
if ssl_verify_callback
net.verify_callback = ssl_verify_callback
if RestClient::Platform.jruby?
net.cert_store ||= OpenSSL::X509::Store.new
end
if ssl_verify_callback_warnings != false
if print_verify_callback_warnings
warn('pass :ssl_verify_callback_warnings => false to silence this')
end
end
end
RestClient.before_execution_procs.each do |before_proc|
before_proc.call(req, args)
end
log_request
net.start do |http|
if @block_response
http.request(req, payload ? payload.to_s : nil, & @block_response)
else
res = http.request(req, payload ? payload.to_s : nil) { |http_response| fetch_body(http_response) }
log_response res
process_result res, & block
end
end
rescue EOFError
raise RestClient::ServerBrokeConnection
rescue Timeout::Error
raise RestClient::RequestTimeout
rescue OpenSSL::SSL::SSLError => error
raise SSLCertificateNotVerified.new(error.message) if error.message.include?("certificate verify failed")
raise error
end