1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
# SOAP4R - HTTP config loader.
# Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
# This program is copyrighted free software by NAKAMURA, Hiroshi. You can
# redistribute it and/or modify it under the same terms of Ruby's license;
# either the dual license version in 2003, or any later version.
require 'soap/property'
module SOAP
module HTTPConfigLoader
module_function
def set_options(client, options)
client.proxy = options["proxy"]
options.add_hook("proxy") do |key, value|
client.proxy = value
end
client.no_proxy = options["no_proxy"]
options.add_hook("no_proxy") do |key, value|
client.no_proxy = value
end
if client.respond_to?(:protocol_version=)
client.protocol_version = options["protocol_version"]
options.add_hook("protocol_version") do |key, value|
client.protocol_version = value
end
end
ssl_config = options["ssl_config"] ||= ::SOAP::Property.new
set_ssl_config(client, ssl_config)
ssl_config.add_hook(true) do |key, value|
set_ssl_config(client, ssl_config)
end
basic_auth = options["basic_auth"] ||= ::SOAP::Property.new
set_basic_auth(client, basic_auth)
basic_auth.add_hook do |key, value|
set_basic_auth(client, basic_auth)
end
auth = options["auth"] ||= ::SOAP::Property.new
set_auth(client, auth)
auth.add_hook do |key, value|
set_auth(client, auth)
end
options.add_hook("connect_timeout") do |key, value|
client.connect_timeout = value
end
options.add_hook("send_timeout") do |key, value|
client.send_timeout = value
end
options.add_hook("receive_timeout") do |key, value|
client.receive_timeout = value
end
end
def set_basic_auth(client, basic_auth)
basic_auth.values.each do |ele|
client.set_basic_auth(*authele_to_triplets(ele))
end
end
def set_auth(client, auth)
auth.values.each do |ele|
client.set_auth(*authele_to_triplets(ele))
end
end
def authele_to_triplets(ele)
if ele.is_a?(::Array)
url, userid, passwd = ele
else
url, userid, passwd = ele[:url], ele[:userid], ele[:password]
end
return url, userid, passwd
end
def set_ssl_config(client, ssl_config)
ssl_config.each do |key, value|
cfg = client.ssl_config
if cfg.nil?
raise NotImplementedError.new("SSL not supported")
end
case key
when 'client_cert'
cfg.client_cert = cert_from_file(value)
when 'client_key'
cfg.client_key = key_from_file(value)
when 'client_ca'
cfg.client_ca = value
when 'ca_path'
cfg.set_trust_ca(value)
when 'ca_file'
cfg.set_trust_ca(value)
when 'crl'
cfg.set_crl(value)
when 'verify_mode'
cfg.verify_mode = ssl_config_int(value)
when 'verify_depth'
cfg.verify_depth = ssl_config_int(value)
when 'options'
cfg.options = value
when 'ciphers'
cfg.ciphers = value
when 'verify_callback'
cfg.verify_callback = value
when 'cert_store'
cfg.cert_store = value
else
raise ArgumentError.new("unknown ssl_config property #{key}")
end
end
end
def ssl_config_int(value)
if value.nil? or value.to_s.empty?
nil
else
begin
Integer(value)
rescue ArgumentError
::SOAP::Property::Util.const_from_name(value.to_s)
end
end
end
def cert_from_file(filename)
OpenSSL::X509::Certificate.new(File.open(filename) { |f| f.read })
end
def key_from_file(filename)
OpenSSL::PKey::RSA.new(File.open(filename) { |f| f.read })
end
end
end
|