From ab31bf0d4d44942e46d98d8848b788ac6df32a46 Mon Sep 17 00:00:00 2001 From: nahi Date: Sat, 3 Jul 2004 15:29:32 +0000 Subject: * added files * lib/soap/attachment.rb * lib/soap/header * lib/soap/mimemessage.rb * lib/soap/rpc/httpserver.rb * lib/wsdl/soap/cgiStubCreator.rb * lib/wsdl/soap/classDefCreator.rb * lib/wsdl/soap/classDefCreatorSupport.rb * lib/wsdl/soap/clientSkeltonCreator.rb * lib/wsdl/soap/driverCreator.rb * lib/wsdl/soap/mappingRegistryCreator.rb * lib/wsdl/soap/methodDefCreator.rb * lib/wsdl/soap/servantSkeltonCreator.rb * lib/wsdl/soap/standaloneServerStubCreator.rb * lib/wsdl/xmlSchema/enumeration.rb * lib/wsdl/xmlSchema/simpleRestriction.rb * lib/wsdl/xmlSchema/simpleType.rb * lib/xsd/codegen * lib/xsd/codegen.rb * sample/soap/authheader * sample/soap/raa2.4 * sample/soap/ssl * sample/soap/swa * sample/soap/whois.rb * sample/soap/calc/samplehttpd.conf * sample/soap/exchange/samplehttpd.conf * sample/soap/sampleStruct/samplehttpd.conf * sample/wsdl/raa2.4 * sample/wsdl/googleSearch/samplehttpd.conf * test/openssl/_test_ssl.rb * test/soap/header * test/soap/ssl * test/soap/struct * test/soap/swa * test/soap/wsdlDriver * test/wsdl/multiplefault.wsdl * test/wsdl/simpletype * test/wsdl/test_multiplefault.rb * modified files * lib/soap/baseData.rb * lib/soap/element.rb * lib/soap/generator.rb * lib/soap/marshal.rb * lib/soap/netHttpClient.rb * lib/soap/parser.rb * lib/soap/processor.rb * lib/soap/property.rb * lib/soap/soap.rb * lib/soap/streamHandler.rb * lib/soap/wsdlDriver.rb * lib/soap/encodingstyle/handler.rb * lib/soap/encodingstyle/literalHandler.rb * lib/soap/encodingstyle/soapHandler.rb * lib/soap/mapping/factory.rb * lib/soap/mapping/mapping.rb * lib/soap/mapping/registry.rb * lib/soap/mapping/rubytypeFactory.rb * lib/soap/mapping/wsdlRegistry.rb * lib/soap/rpc/cgistub.rb * lib/soap/rpc/driver.rb * lib/soap/rpc/element.rb * lib/soap/rpc/proxy.rb * lib/soap/rpc/router.rb * lib/soap/rpc/soaplet.rb * lib/soap/rpc/standaloneServer.rb * lib/wsdl/data.rb * lib/wsdl/definitions.rb * lib/wsdl/operation.rb * lib/wsdl/parser.rb * lib/wsdl/soap/definitions.rb * lib/wsdl/xmlSchema/complexContent.rb * lib/wsdl/xmlSchema/complexType.rb * lib/wsdl/xmlSchema/data.rb * lib/wsdl/xmlSchema/parser.rb * lib/wsdl/xmlSchema/schema.rb * lib/xsd/datatypes.rb * lib/xsd/qname.rb * sample/soap/calc/httpd.rb * sample/soap/exchange/httpd.rb * sample/soap/sampleStruct/httpd.rb * sample/soap/sampleStruct/server.rb * sample/wsdl/amazon/AmazonSearch.rb * sample/wsdl/amazon/AmazonSearchDriver.rb * sample/wsdl/googleSearch/httpd.rb * test/soap/test_basetype.rb * test/soap/test_property.rb * test/soap/test_streamhandler.rb * test/soap/calc/test_calc.rb * test/soap/calc/test_calc2.rb * test/soap/calc/test_calc_cgi.rb * test/soap/helloworld/test_helloworld.rb * test/wsdl/test_emptycomplextype.rb * test/wsdl/axisArray/test_axisarray.rb * test/wsdl/datetime/test_datetime.rb * test/wsdl/raa/test_raa.rb * test/xsd/test_xmlschemaparser.rb * test/xsd/test_xsd.rb * summary * add SOAP Header mustUnderstand support. * add HTTP client SSL configuration and Cookies support (works completely with http-access2). * add header handler for handling sending/receiving SOAP Header. * map Ruby's anonymous Struct to common SOAP Struct in SOAP Object Model. it caused error. * add WSDL simpleType support to restrict lexical value space. * add SOAP with Attachment support. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6567 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/soap/streamHandler.rb | 116 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 82 insertions(+), 34 deletions(-) (limited to 'lib/soap/streamHandler.rb') diff --git a/lib/soap/streamHandler.rb b/lib/soap/streamHandler.rb index d6b9c3bdca..efadf21e07 100644 --- a/lib/soap/streamHandler.rb +++ b/lib/soap/streamHandler.rb @@ -33,21 +33,14 @@ class StreamHandler attr_accessor :send_contenttype attr_accessor :receive_string attr_accessor :receive_contenttype + attr_accessor :is_fault - def initialize - @send_string = nil + def initialize(send_string = nil) + @send_string = send_string @send_contenttype = nil @receive_string = nil @receive_contenttype = nil - @bag = {} - end - - def [](idx) - @bag[idx] - end - - def []=(idx, value) - @bag[idx] = value + @is_fault = false end end @@ -59,7 +52,7 @@ class StreamHandler def self.parse_media_type(str) if /^#{ MediaType }(?:\s*;\s*charset=([^"]+|"[^"]+"))?$/i !~ str - raise StreamError.new("Illegal media type."); + return nil end charset = $1 charset.gsub!(/"/, '') if charset @@ -90,18 +83,24 @@ public @options = options set_options @client.debug_dev = @wiredump_dev + @cookie_store = nil + end + + def test_loopback_response + @client.test_loopback_response end def inspect "#<#{self.class}:#{endpoint_url}>" end - def send(soap_string, soapaction = nil, charset = @charset) - send_post(soap_string, soapaction, charset) + def send(conn_data, soapaction = nil, charset = @charset) + send_post(conn_data, soapaction, charset) end def reset @client.reset(@endpoint_url) + @client.save_cookie_store if @cookie_store end private @@ -125,10 +124,6 @@ private @options.add_hook("cookie_store_file") do |key, value| set_cookie_store_file(value) end - set_ssl_config(@options["ssl_config"]) - @options.add_hook("ssl_config") do |key, value| - set_ssl_config(@options["ssl_config"]) - end @charset = @options["charset"] || XSD::Charset.charset_label($KCODE) @options.add_hook("charset") do |key, value| @charset = value @@ -138,12 +133,18 @@ private @wiredump_dev = value @client.debug_dev = @wiredump_dev end + ssl_config = @options["ssl_config"] ||= ::SOAP::Property.new + set_ssl_config(ssl_config) + ssl_config.add_hook(true) do |key, value| + set_ssl_config(ssl_config) + end basic_auth = @options["basic_auth"] ||= ::SOAP::Property.new set_basic_auth(basic_auth) basic_auth.add_hook do |key, value| set_basic_auth(basic_auth) end @options.lock(true) + ssl_config.unlock basic_auth.unlock end @@ -154,34 +155,82 @@ private end def set_cookie_store_file(value) - return unless value - raise NotImplementedError.new + @cookie_store = value + @client.set_cookie_store(@cookie_store) if @cookie_store + end + + def set_ssl_config(ssl_config) + ssl_config.each do |key, value| + cfg = @client.ssl_config + 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.empty? + nil + else + begin + Integer(value) + rescue ArgumentError + ::SOAP::Property::Util.const_from_name(value) + end + end end - def set_ssl_config(value) - return unless value - raise NotImplementedError.new + def cert_from_file(filename) + OpenSSL::X509::Certificate.new(File.open(filename) { |f| f.read }) end - def send_post(soap_string, soapaction, charset) - data = ConnectionData.new - data.send_string = soap_string - data.send_contenttype = StreamHandler.create_media_type(charset) + def key_from_file(filename) + OpenSSL::PKey::RSA.new(File.open(filename) { |f| f.read }) + end + + def send_post(conn_data, soapaction, charset) + conn_data.send_contenttype ||= StreamHandler.create_media_type(charset) if @wiredump_file_base filename = @wiredump_file_base + '_request.xml' f = File.open(filename, "w") - f << soap_string + f << conn_data.send_string f.close end extra = {} - extra['Content-Type'] = data.send_contenttype + extra['Content-Type'] = conn_data.send_contenttype extra['SOAPAction'] = "\"#{ soapaction }\"" + send_string = conn_data.send_string @wiredump_dev << "Wire dump:\n\n" if @wiredump_dev begin - res = @client.post(@endpoint_url, soap_string, extra) + res = @client.post(@endpoint_url, send_string, extra) rescue @client.reset(@endpoint_url) raise @@ -206,10 +255,9 @@ private raise HTTPStreamError.new("#{ res.status }: #{ res.reason }") end - data.receive_string = receive_string - data.receive_contenttype = res.contenttype - - return data + conn_data.receive_string = receive_string + conn_data.receive_contenttype = res.contenttype + conn_data end CRLF = "\r\n" -- cgit v1.2.3