reidiculous-actionwebservice-client 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. data/CHANGELOG +320 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +381 -0
  4. data/Rakefile +180 -0
  5. data/TODO +32 -0
  6. data/lib/action_web_service.rb +71 -0
  7. data/lib/action_web_service/api.rb +297 -0
  8. data/lib/action_web_service/base.rb +38 -0
  9. data/lib/action_web_service/casting.rb +149 -0
  10. data/lib/action_web_service/client.rb +3 -0
  11. data/lib/action_web_service/client/base.rb +28 -0
  12. data/lib/action_web_service/client/soap_client.rb +113 -0
  13. data/lib/action_web_service/client/xmlrpc_client.rb +58 -0
  14. data/lib/action_web_service/container.rb +3 -0
  15. data/lib/action_web_service/container/action_controller_container.rb +93 -0
  16. data/lib/action_web_service/container/delegated_container.rb +86 -0
  17. data/lib/action_web_service/container/direct_container.rb +69 -0
  18. data/lib/action_web_service/dispatcher.rb +2 -0
  19. data/lib/action_web_service/dispatcher/abstract.rb +207 -0
  20. data/lib/action_web_service/dispatcher/action_controller_dispatcher.rb +379 -0
  21. data/lib/action_web_service/invocation.rb +202 -0
  22. data/lib/action_web_service/protocol.rb +4 -0
  23. data/lib/action_web_service/protocol/abstract.rb +115 -0
  24. data/lib/action_web_service/protocol/discovery.rb +37 -0
  25. data/lib/action_web_service/protocol/soap_protocol.rb +176 -0
  26. data/lib/action_web_service/protocol/soap_protocol/marshaler.rb +242 -0
  27. data/lib/action_web_service/protocol/xmlrpc_protocol.rb +122 -0
  28. data/lib/action_web_service/scaffolding.rb +281 -0
  29. data/lib/action_web_service/soap/attachment.rb +107 -0
  30. data/lib/action_web_service/soap/baseData.rb +942 -0
  31. data/lib/action_web_service/soap/element.rb +258 -0
  32. data/lib/action_web_service/soap/encodingstyle/aspDotNetHandler.rb +213 -0
  33. data/lib/action_web_service/soap/encodingstyle/handler.rb +100 -0
  34. data/lib/action_web_service/soap/encodingstyle/literalHandler.rb +226 -0
  35. data/lib/action_web_service/soap/encodingstyle/soapHandler.rb +582 -0
  36. data/lib/action_web_service/soap/generator.rb +268 -0
  37. data/lib/action_web_service/soap/header/handler.rb +57 -0
  38. data/lib/action_web_service/soap/header/handlerset.rb +70 -0
  39. data/lib/action_web_service/soap/header/simplehandler.rb +44 -0
  40. data/lib/action_web_service/soap/httpconfigloader.rb +119 -0
  41. data/lib/action_web_service/soap/mapping.rb +10 -0
  42. data/lib/action_web_service/soap/mapping/factory.rb +355 -0
  43. data/lib/action_web_service/soap/mapping/mapping.rb +381 -0
  44. data/lib/action_web_service/soap/mapping/registry.rb +541 -0
  45. data/lib/action_web_service/soap/mapping/rubytypeFactory.rb +475 -0
  46. data/lib/action_web_service/soap/mapping/typeMap.rb +50 -0
  47. data/lib/action_web_service/soap/mapping/wsdlencodedregistry.rb +280 -0
  48. data/lib/action_web_service/soap/mapping/wsdlliteralregistry.rb +418 -0
  49. data/lib/action_web_service/soap/marshal.rb +59 -0
  50. data/lib/action_web_service/soap/mimemessage.rb +240 -0
  51. data/lib/action_web_service/soap/netHttpClient.rb +190 -0
  52. data/lib/action_web_service/soap/parser.rb +251 -0
  53. data/lib/action_web_service/soap/processor.rb +66 -0
  54. data/lib/action_web_service/soap/property.rb +333 -0
  55. data/lib/action_web_service/soap/rpc/cgistub.rb +206 -0
  56. data/lib/action_web_service/soap/rpc/driver.rb +254 -0
  57. data/lib/action_web_service/soap/rpc/element.rb +325 -0
  58. data/lib/action_web_service/soap/rpc/httpserver.rb +129 -0
  59. data/lib/action_web_service/soap/rpc/proxy.rb +497 -0
  60. data/lib/action_web_service/soap/rpc/router.rb +594 -0
  61. data/lib/action_web_service/soap/rpc/rpc.rb +25 -0
  62. data/lib/action_web_service/soap/rpc/soaplet.rb +162 -0
  63. data/lib/action_web_service/soap/rpc/standaloneServer.rb +43 -0
  64. data/lib/action_web_service/soap/soap.rb +140 -0
  65. data/lib/action_web_service/soap/streamHandler.rb +229 -0
  66. data/lib/action_web_service/soap/wsdlDriver.rb +575 -0
  67. data/lib/action_web_service/struct.rb +64 -0
  68. data/lib/action_web_service/support/class_inheritable_options.rb +28 -0
  69. data/lib/action_web_service/support/signature_types.rb +227 -0
  70. data/lib/action_web_service/test_invoke.rb +110 -0
  71. data/lib/action_web_service/version.rb +9 -0
  72. data/lib/action_web_service/wsdl/binding.rb +65 -0
  73. data/lib/action_web_service/wsdl/data.rb +64 -0
  74. data/lib/action_web_service/wsdl/definitions.rb +250 -0
  75. data/lib/action_web_service/wsdl/documentation.rb +32 -0
  76. data/lib/action_web_service/wsdl/import.rb +80 -0
  77. data/lib/action_web_service/wsdl/importer.rb +38 -0
  78. data/lib/action_web_service/wsdl/info.rb +39 -0
  79. data/lib/action_web_service/wsdl/message.rb +54 -0
  80. data/lib/action_web_service/wsdl/operation.rb +130 -0
  81. data/lib/action_web_service/wsdl/operationBinding.rb +108 -0
  82. data/lib/action_web_service/wsdl/param.rb +85 -0
  83. data/lib/action_web_service/wsdl/parser.rb +163 -0
  84. data/lib/action_web_service/wsdl/part.rb +52 -0
  85. data/lib/action_web_service/wsdl/port.rb +84 -0
  86. data/lib/action_web_service/wsdl/portType.rb +73 -0
  87. data/lib/action_web_service/wsdl/service.rb +61 -0
  88. data/lib/action_web_service/wsdl/soap/address.rb +40 -0
  89. data/lib/action_web_service/wsdl/soap/binding.rb +49 -0
  90. data/lib/action_web_service/wsdl/soap/body.rb +56 -0
  91. data/lib/action_web_service/wsdl/soap/cgiStubCreator.rb +76 -0
  92. data/lib/action_web_service/wsdl/soap/classDefCreator.rb +314 -0
  93. data/lib/action_web_service/wsdl/soap/classDefCreatorSupport.rb +126 -0
  94. data/lib/action_web_service/wsdl/soap/clientSkeltonCreator.rb +78 -0
  95. data/lib/action_web_service/wsdl/soap/complexType.rb +161 -0
  96. data/lib/action_web_service/wsdl/soap/data.rb +42 -0
  97. data/lib/action_web_service/wsdl/soap/definitions.rb +149 -0
  98. data/lib/action_web_service/wsdl/soap/driverCreator.rb +95 -0
  99. data/lib/action_web_service/wsdl/soap/element.rb +28 -0
  100. data/lib/action_web_service/wsdl/soap/fault.rb +56 -0
  101. data/lib/action_web_service/wsdl/soap/header.rb +86 -0
  102. data/lib/action_web_service/wsdl/soap/headerfault.rb +56 -0
  103. data/lib/action_web_service/wsdl/soap/mappingRegistryCreator.rb +92 -0
  104. data/lib/action_web_service/wsdl/soap/methodDefCreator.rb +228 -0
  105. data/lib/action_web_service/wsdl/soap/operation.rb +122 -0
  106. data/lib/action_web_service/wsdl/soap/servantSkeltonCreator.rb +67 -0
  107. data/lib/action_web_service/wsdl/soap/standaloneServerStubCreator.rb +85 -0
  108. data/lib/action_web_service/wsdl/soap/wsdl2ruby.rb +176 -0
  109. data/lib/action_web_service/wsdl/types.rb +43 -0
  110. data/lib/action_web_service/wsdl/wsdl.rb +23 -0
  111. data/lib/action_web_service/wsdl/xmlSchema/all.rb +69 -0
  112. data/lib/action_web_service/wsdl/xmlSchema/annotation.rb +34 -0
  113. data/lib/action_web_service/wsdl/xmlSchema/any.rb +56 -0
  114. data/lib/action_web_service/wsdl/xmlSchema/attribute.rb +127 -0
  115. data/lib/action_web_service/wsdl/xmlSchema/choice.rb +69 -0
  116. data/lib/action_web_service/wsdl/xmlSchema/complexContent.rb +92 -0
  117. data/lib/action_web_service/wsdl/xmlSchema/complexType.rb +139 -0
  118. data/lib/action_web_service/wsdl/xmlSchema/content.rb +96 -0
  119. data/lib/action_web_service/wsdl/xmlSchema/data.rb +80 -0
  120. data/lib/action_web_service/wsdl/xmlSchema/element.rb +154 -0
  121. data/lib/action_web_service/wsdl/xmlSchema/enumeration.rb +36 -0
  122. data/lib/action_web_service/wsdl/xmlSchema/import.rb +65 -0
  123. data/lib/action_web_service/wsdl/xmlSchema/importer.rb +87 -0
  124. data/lib/action_web_service/wsdl/xmlSchema/include.rb +54 -0
  125. data/lib/action_web_service/wsdl/xmlSchema/length.rb +35 -0
  126. data/lib/action_web_service/wsdl/xmlSchema/parser.rb +166 -0
  127. data/lib/action_web_service/wsdl/xmlSchema/pattern.rb +36 -0
  128. data/lib/action_web_service/wsdl/xmlSchema/schema.rb +143 -0
  129. data/lib/action_web_service/wsdl/xmlSchema/sequence.rb +69 -0
  130. data/lib/action_web_service/wsdl/xmlSchema/simpleContent.rb +65 -0
  131. data/lib/action_web_service/wsdl/xmlSchema/simpleExtension.rb +54 -0
  132. data/lib/action_web_service/wsdl/xmlSchema/simpleRestriction.rb +73 -0
  133. data/lib/action_web_service/wsdl/xmlSchema/simpleType.rb +73 -0
  134. data/lib/action_web_service/wsdl/xmlSchema/unique.rb +34 -0
  135. data/lib/action_web_service/wsdl/xmlSchema/xsd2ruby.rb +107 -0
  136. data/lib/action_web_service/xsd/charset.rb +187 -0
  137. data/lib/action_web_service/xsd/codegen.rb +12 -0
  138. data/lib/action_web_service/xsd/codegen/classdef.rb +203 -0
  139. data/lib/action_web_service/xsd/codegen/commentdef.rb +34 -0
  140. data/lib/action_web_service/xsd/codegen/gensupport.rb +166 -0
  141. data/lib/action_web_service/xsd/codegen/methoddef.rb +63 -0
  142. data/lib/action_web_service/xsd/codegen/moduledef.rb +191 -0
  143. data/lib/action_web_service/xsd/datatypes.rb +1269 -0
  144. data/lib/action_web_service/xsd/datatypes1999.rb +20 -0
  145. data/lib/action_web_service/xsd/iconvcharset.rb +33 -0
  146. data/lib/action_web_service/xsd/mapping.rb +42 -0
  147. data/lib/action_web_service/xsd/namedelements.rb +95 -0
  148. data/lib/action_web_service/xsd/ns.rb +140 -0
  149. data/lib/action_web_service/xsd/qname.rb +78 -0
  150. data/lib/action_web_service/xsd/xmlparser.rb +61 -0
  151. data/lib/action_web_service/xsd/xmlparser/parser.rb +96 -0
  152. data/lib/action_web_service/xsd/xmlparser/rexmlparser.rb +54 -0
  153. data/lib/action_web_service/xsd/xmlparser/xmlparser.rb +50 -0
  154. data/lib/action_web_service/xsd/xmlparser/xmlscanner.rb +147 -0
  155. data/lib/actionwebservice.rb +1 -0
  156. data/setup.rb +1379 -0
  157. data/test/abstract_client.rb +183 -0
  158. data/test/abstract_dispatcher.rb +548 -0
  159. data/test/abstract_unit.rb +45 -0
  160. data/test/api_test.rb +103 -0
  161. data/test/apis/auto_load_api.rb +3 -0
  162. data/test/apis/broken_auto_load_api.rb +2 -0
  163. data/test/base_test.rb +42 -0
  164. data/test/casting_test.rb +95 -0
  165. data/test/client_soap_test.rb +156 -0
  166. data/test/client_xmlrpc_test.rb +153 -0
  167. data/test/container_test.rb +73 -0
  168. data/test/dispatcher_action_controller_soap_test.rb +139 -0
  169. data/test/dispatcher_action_controller_xmlrpc_test.rb +59 -0
  170. data/test/fixtures/db_definitions/mysql.sql +8 -0
  171. data/test/fixtures/db_definitions/sqlite3.sql +8 -0
  172. data/test/fixtures/users.yml +12 -0
  173. data/test/gencov +3 -0
  174. data/test/invocation_test.rb +185 -0
  175. data/test/run +6 -0
  176. data/test/scaffolded_controller_test.rb +146 -0
  177. data/test/struct_test.rb +52 -0
  178. data/test/test_invoke_test.rb +112 -0
  179. metadata +265 -0
@@ -0,0 +1,25 @@
1
+ # SOAP4R - RPC utility.
2
+ # Copyright (C) 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ module SOAP
10
+
11
+
12
+ module RPC
13
+ ServerException = Mapping::MappedException
14
+
15
+ def self.defined_methods(obj)
16
+ if obj.is_a?(Module)
17
+ obj.methods - Module.methods
18
+ else
19
+ obj.methods - Object.instance_methods(true)
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+ end
@@ -0,0 +1,162 @@
1
+ # SOAP4R - SOAP handler servlet for WEBrick
2
+ # Copyright (C) 2001-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'webrick/httpservlet/abstract'
10
+ require 'webrick/httpstatus'
11
+ require 'action_web_service/soap/rpc/router'
12
+ require 'action_web_service/soap/streamHandler'
13
+ begin
14
+ require 'stringio'
15
+ require 'zlib'
16
+ rescue LoadError
17
+ warn("Loading stringio or zlib failed. No gzipped response supported.") if $DEBUG
18
+ end
19
+
20
+
21
+ warn("Overriding WEBrick::Log#debug") if $DEBUG
22
+ require 'webrick/log'
23
+ module WEBrick
24
+ class Log < BasicLog
25
+ alias __debug debug
26
+ def debug(msg = nil)
27
+ if block_given? and msg.nil?
28
+ __debug(yield)
29
+ else
30
+ __debug(msg)
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+
37
+ module SOAP
38
+ module RPC
39
+
40
+
41
+ class SOAPlet < WEBrick::HTTPServlet::AbstractServlet
42
+ public
43
+ attr_reader :options
44
+
45
+ def initialize(router = nil)
46
+ @router = router || ::SOAP::RPC::Router.new(self.class.name)
47
+ @options = {}
48
+ @config = {}
49
+ end
50
+
51
+ # for backward compatibility
52
+ def app_scope_router
53
+ @router
54
+ end
55
+
56
+ # for backward compatibility
57
+ def add_servant(obj, namespace)
58
+ @router.add_rpc_servant(obj, namespace)
59
+ end
60
+
61
+ def allow_content_encoding_gzip=(allow)
62
+ @options[:allow_content_encoding_gzip] = allow
63
+ end
64
+
65
+ ###
66
+ ## Servlet interfaces for WEBrick.
67
+ #
68
+ def get_instance(config, *options)
69
+ @config = config
70
+ self
71
+ end
72
+
73
+ def require_path_info?
74
+ false
75
+ end
76
+
77
+ def do_GET(req, res)
78
+ res.header['Allow'] = 'POST'
79
+ raise WEBrick::HTTPStatus::MethodNotAllowed, "GET request not allowed"
80
+ end
81
+
82
+ def do_POST(req, res)
83
+ logger.debug { "SOAP request: " + req.body } if logger
84
+ begin
85
+ conn_data = ::SOAP::StreamHandler::ConnectionData.new
86
+ setup_req(conn_data, req)
87
+ @router.external_ces = @options[:external_ces]
88
+ conn_data = @router.route(conn_data)
89
+ setup_res(conn_data, req, res)
90
+ rescue Exception => e
91
+ conn_data = @router.create_fault_response(e)
92
+ res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
93
+ res.body = conn_data.send_string
94
+ res['content-type'] = conn_data.send_contenttype || "text/xml"
95
+ end
96
+ if res.body.is_a?(IO)
97
+ res.chunked = true
98
+ logger.debug { "SOAP response: (chunked response not logged)" } if logger
99
+ else
100
+ logger.debug { "SOAP response: " + res.body } if logger
101
+ end
102
+ end
103
+
104
+ private
105
+
106
+ def logger
107
+ @config[:Logger]
108
+ end
109
+
110
+ def setup_req(conn_data, req)
111
+ conn_data.receive_string = req.body
112
+ conn_data.receive_contenttype = req['content-type']
113
+ conn_data.soapaction = parse_soapaction(req.meta_vars['HTTP_SOAPACTION'])
114
+ end
115
+
116
+ def setup_res(conn_data, req, res)
117
+ res['content-type'] = conn_data.send_contenttype
118
+ if conn_data.is_fault
119
+ res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
120
+ end
121
+ if outstring = encode_gzip(req, conn_data.send_string)
122
+ res['content-encoding'] = 'gzip'
123
+ res['content-length'] = outstring.size
124
+ res.body = outstring
125
+ else
126
+ res.body = conn_data.send_string
127
+ end
128
+ end
129
+
130
+ def parse_soapaction(soapaction)
131
+ if !soapaction.nil? and !soapaction.empty?
132
+ if /^"(.+)"$/ =~ soapaction
133
+ return $1
134
+ end
135
+ end
136
+ nil
137
+ end
138
+
139
+ def encode_gzip(req, outstring)
140
+ unless encode_gzip?(req)
141
+ return nil
142
+ end
143
+ begin
144
+ ostream = StringIO.new
145
+ gz = Zlib::GzipWriter.new(ostream)
146
+ gz.write(outstring)
147
+ ostream.string
148
+ ensure
149
+ gz.close
150
+ end
151
+ end
152
+
153
+ def encode_gzip?(req)
154
+ @options[:allow_content_encoding_gzip] and defined?(::Zlib) and
155
+ req['accept-encoding'] and
156
+ req['accept-encoding'].split(/,\s*/).include?('gzip')
157
+ end
158
+ end
159
+
160
+
161
+ end
162
+ end
@@ -0,0 +1,43 @@
1
+ # SOAP4R - WEBrick Server
2
+ # Copyright (C) 2003 by NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'action_web_service/soap/rpc/httpserver'
10
+
11
+
12
+ module SOAP
13
+ module RPC
14
+
15
+
16
+ class StandaloneServer < HTTPServer
17
+ def initialize(appname, default_namespace, host = "0.0.0.0", port = 8080)
18
+ @appname = appname
19
+ @default_namespace = default_namespace
20
+ @host = host
21
+ @port = port
22
+ super(create_config)
23
+ end
24
+
25
+ alias add_servant add_rpc_servant
26
+ alias add_headerhandler add_rpc_headerhandler
27
+
28
+ private
29
+
30
+ def create_config
31
+ {
32
+ :BindAddress => @host,
33
+ :Port => @port,
34
+ :AccessLog => [],
35
+ :SOAPDefaultNamespace => @default_namespace,
36
+ :SOAPHTTPServerApplicationName => @appname,
37
+ }
38
+ end
39
+ end
40
+
41
+
42
+ end
43
+ end
@@ -0,0 +1,140 @@
1
+ # soap/soap.rb: SOAP4R - Base definitions.
2
+ # Copyright (C) 2000-2004 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'action_web_service/xsd/qname'
10
+ require 'action_web_service/xsd/charset'
11
+
12
+
13
+ module SOAP
14
+
15
+
16
+ VERSION = Version = '1.5.5'
17
+ PropertyName = 'action_web_service/soap/property'
18
+
19
+ EnvelopeNamespace = 'http://schemas.xmlsoap.org/soap/envelope/'
20
+ EncodingNamespace = 'http://schemas.xmlsoap.org/soap/encoding/'
21
+ LiteralNamespace = 'http://xml.apache.org/xml-soap/literalxml'
22
+
23
+ NextActor = 'http://schemas.xmlsoap.org/soap/actor/next'
24
+
25
+ EleEnvelope = 'Envelope'
26
+ EleHeader = 'Header'
27
+ EleBody = 'Body'
28
+ EleFault = 'Fault'
29
+ EleFaultString = 'faultstring'
30
+ EleFaultActor = 'faultactor'
31
+ EleFaultCode = 'faultcode'
32
+ EleFaultDetail = 'detail'
33
+
34
+ AttrMustUnderstand = 'mustUnderstand'
35
+ AttrEncodingStyle = 'encodingStyle'
36
+ AttrActor = 'actor'
37
+ AttrRoot = 'root'
38
+ AttrArrayType = 'arrayType'
39
+ AttrOffset = 'offset'
40
+ AttrPosition = 'position'
41
+ ValueArray = 'Array'
42
+
43
+ EleEnvelopeName = XSD::QName.new(EnvelopeNamespace, EleEnvelope).freeze
44
+ EleHeaderName = XSD::QName.new(EnvelopeNamespace, EleHeader).freeze
45
+ EleBodyName = XSD::QName.new(EnvelopeNamespace, EleBody).freeze
46
+ EleFaultName = XSD::QName.new(EnvelopeNamespace, EleFault).freeze
47
+ EleFaultStringName = XSD::QName.new(nil, EleFaultString).freeze
48
+ EleFaultActorName = XSD::QName.new(nil, EleFaultActor).freeze
49
+ EleFaultCodeName = XSD::QName.new(nil, EleFaultCode).freeze
50
+ EleFaultDetailName = XSD::QName.new(nil, EleFaultDetail).freeze
51
+ AttrMustUnderstandName = XSD::QName.new(EnvelopeNamespace, AttrMustUnderstand).freeze
52
+ AttrEncodingStyleName = XSD::QName.new(EnvelopeNamespace, AttrEncodingStyle).freeze
53
+ AttrRootName = XSD::QName.new(EncodingNamespace, AttrRoot).freeze
54
+ AttrArrayTypeName = XSD::QName.new(EncodingNamespace, AttrArrayType).freeze
55
+ AttrOffsetName = XSD::QName.new(EncodingNamespace, AttrOffset).freeze
56
+ AttrPositionName = XSD::QName.new(EncodingNamespace, AttrPosition).freeze
57
+ ValueArrayName = XSD::QName.new(EncodingNamespace, ValueArray).freeze
58
+
59
+ Base64Literal = 'base64'
60
+
61
+ SOAPNamespaceTag = 'env'
62
+ XSDNamespaceTag = 'action_web_service/xsd'
63
+ XSINamespaceTag = 'xsi'
64
+
65
+ MediaType = 'text/xml'
66
+
67
+ class Error < StandardError; end
68
+
69
+ class StreamError < Error; end
70
+ class HTTPStreamError < StreamError; end
71
+ class PostUnavailableError < HTTPStreamError; end
72
+ class MPostUnavailableError < HTTPStreamError; end
73
+
74
+ class ArrayIndexOutOfBoundsError < Error; end
75
+ class ArrayStoreError < Error; end
76
+
77
+ class RPCRoutingError < Error; end
78
+ class EmptyResponseError < Error; end
79
+ class ResponseFormatError < Error; end
80
+
81
+ class UnhandledMustUnderstandHeaderError < Error; end
82
+
83
+ class FaultError < Error
84
+ attr_reader :faultcode
85
+ attr_reader :faultstring
86
+ attr_reader :faultactor
87
+ attr_accessor :detail
88
+
89
+ def initialize(fault)
90
+ @faultcode = fault.faultcode
91
+ @faultstring = fault.faultstring
92
+ @faultactor = fault.faultactor
93
+ @detail = fault.detail
94
+ super(self.to_s)
95
+ end
96
+
97
+ def to_s
98
+ str = nil
99
+ if @faultstring and @faultstring.respond_to?('data')
100
+ str = @faultstring.data
101
+ end
102
+ str || '(No faultstring)'
103
+ end
104
+ end
105
+
106
+
107
+ module Env
108
+ def self.getenv(name)
109
+ ENV[name.downcase] || ENV[name.upcase]
110
+ end
111
+
112
+ use_proxy = getenv('action_web_service/soap_use_proxy') == 'on'
113
+ HTTP_PROXY = use_proxy ? getenv('http_proxy') : nil
114
+ NO_PROXY = use_proxy ? getenv('no_proxy') : nil
115
+ end
116
+
117
+
118
+ end
119
+
120
+
121
+ unless Object.respond_to?(:instance_variable_get)
122
+ class Object
123
+ def instance_variable_get(ivarname)
124
+ instance_eval(ivarname)
125
+ end
126
+
127
+ def instance_variable_set(ivarname, value)
128
+ instance_eval("#{ivarname} = value")
129
+ end
130
+ end
131
+ end
132
+
133
+
134
+ unless Kernel.respond_to?(:warn)
135
+ module Kernel
136
+ def warn(msg)
137
+ STDERR.puts(msg + "\n") unless $VERBOSE.nil?
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,229 @@
1
+ # SOAP4R - Stream handler.
2
+ # Copyright (C) 2000, 2001, 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
+
4
+ # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
+ # redistribute it and/or modify it under the same terms of Ruby's license;
6
+ # either the dual license version in 2003, or any later version.
7
+
8
+
9
+ require 'action_web_service/soap/soap'
10
+ require 'action_web_service/soap/httpconfigloader'
11
+ begin
12
+ require 'stringio'
13
+ require 'zlib'
14
+ rescue LoadError
15
+ warn("Loading stringio or zlib failed. No gzipped response support.") if $DEBUG
16
+ end
17
+
18
+
19
+ module SOAP
20
+
21
+
22
+ class StreamHandler
23
+ RUBY_VERSION_STRING = "ruby #{ RUBY_VERSION } (#{ RUBY_RELEASE_DATE }) [#{ RUBY_PLATFORM }]"
24
+
25
+ class ConnectionData
26
+ attr_accessor :send_string
27
+ attr_accessor :send_contenttype
28
+ attr_accessor :receive_string
29
+ attr_accessor :receive_contenttype
30
+ attr_accessor :is_fault
31
+ attr_accessor :soapaction
32
+
33
+ def initialize(send_string = nil)
34
+ @send_string = send_string
35
+ @send_contenttype = nil
36
+ @receive_string = nil
37
+ @receive_contenttype = nil
38
+ @is_fault = false
39
+ @soapaction = nil
40
+ end
41
+ end
42
+
43
+ def self.parse_media_type(str)
44
+ if /^#{ MediaType }(?:\s*;\s*charset=([^"]+|"[^"]+"))?$/i !~ str
45
+ return nil
46
+ end
47
+ charset = $1
48
+ charset.gsub!(/"/, '') if charset
49
+ charset || 'us-ascii'
50
+ end
51
+
52
+ def self.create_media_type(charset)
53
+ "#{ MediaType }; charset=#{ charset }"
54
+ end
55
+ end
56
+
57
+
58
+ class HTTPStreamHandler < StreamHandler
59
+ include SOAP
60
+
61
+ begin
62
+ require 'http-access2'
63
+ if HTTPAccess2::VERSION < "2.0"
64
+ raise LoadError.new("http-access/2.0 or later is required.")
65
+ end
66
+ Client = HTTPAccess2::Client
67
+ RETRYABLE = true
68
+ rescue LoadError
69
+ warn("Loading http-access2 failed. Net/http is used.") if $DEBUG
70
+ require 'action_web_service/soap/netHttpClient'
71
+ Client = SOAP::NetHttpClient
72
+ RETRYABLE = false
73
+ end
74
+
75
+
76
+ public
77
+
78
+ attr_reader :client
79
+ attr_accessor :wiredump_file_base
80
+
81
+ MAX_RETRY_COUNT = 10 # [times]
82
+
83
+ def initialize(options)
84
+ super()
85
+ @client = Client.new(nil, "SOAP4R/#{ Version }")
86
+ @wiredump_file_base = nil
87
+ @charset = @wiredump_dev = nil
88
+ @options = options
89
+ set_options
90
+ @client.debug_dev = @wiredump_dev
91
+ @cookie_store = nil
92
+ @accept_encoding_gzip = false
93
+ end
94
+
95
+ def test_loopback_response
96
+ @client.test_loopback_response
97
+ end
98
+
99
+ def accept_encoding_gzip=(allow)
100
+ @accept_encoding_gzip = allow
101
+ end
102
+
103
+ def inspect
104
+ "#<#{self.class}>"
105
+ end
106
+
107
+ def send(endpoint_url, conn_data, soapaction = nil, charset = @charset)
108
+ conn_data.soapaction ||= soapaction # for backward conpatibility
109
+ send_post(endpoint_url, conn_data, charset)
110
+ end
111
+
112
+ def reset(endpoint_url = nil)
113
+ if endpoint_url.nil?
114
+ @client.reset_all
115
+ else
116
+ @client.reset(endpoint_url)
117
+ end
118
+ @client.save_cookie_store if @cookie_store
119
+ end
120
+
121
+ private
122
+
123
+ def set_options
124
+ HTTPConfigLoader.set_options(@client, @options)
125
+ @charset = @options["charset"] || XSD::Charset.xml_encoding_label
126
+ @options.add_hook("charset") do |key, value|
127
+ @charset = value
128
+ end
129
+ @wiredump_dev = @options["wiredump_dev"]
130
+ @options.add_hook("wiredump_dev") do |key, value|
131
+ @wiredump_dev = value
132
+ @client.debug_dev = @wiredump_dev
133
+ end
134
+ set_cookie_store_file(@options["cookie_store_file"])
135
+ @options.add_hook("cookie_store_file") do |key, value|
136
+ set_cookie_store_file(value)
137
+ end
138
+ ssl_config = @options["ssl_config"]
139
+ basic_auth = @options["basic_auth"]
140
+ @options.lock(true)
141
+ ssl_config.unlock
142
+ basic_auth.unlock
143
+ end
144
+
145
+ def set_cookie_store_file(value)
146
+ value = nil if value and value.empty?
147
+ @cookie_store = value
148
+ @client.set_cookie_store(@cookie_store) if @cookie_store
149
+ end
150
+
151
+ def send_post(endpoint_url, conn_data, charset)
152
+ conn_data.send_contenttype ||= StreamHandler.create_media_type(charset)
153
+
154
+ if @wiredump_file_base
155
+ filename = @wiredump_file_base + '_request.xml'
156
+ f = File.open(filename, "w")
157
+ f << conn_data.send_string
158
+ f.close
159
+ end
160
+
161
+ extra = {}
162
+ extra['Content-Type'] = conn_data.send_contenttype
163
+ extra['SOAPAction'] = "\"#{ conn_data.soapaction }\""
164
+ extra['Accept-Encoding'] = 'gzip' if send_accept_encoding_gzip?
165
+ send_string = conn_data.send_string
166
+ @wiredump_dev << "Wire dump:\n\n" if @wiredump_dev
167
+ begin
168
+ retry_count = 0
169
+ while true
170
+ res = @client.post(endpoint_url, send_string, extra)
171
+ if RETRYABLE and HTTP::Status.redirect?(res.status)
172
+ retry_count += 1
173
+ if retry_count >= MAX_RETRY_COUNT
174
+ raise HTTPStreamError.new("redirect count exceeded")
175
+ end
176
+ endpoint_url = res.header["location"][0]
177
+ puts "redirected to #{endpoint_url}" if $DEBUG
178
+ else
179
+ break
180
+ end
181
+ end
182
+ rescue
183
+ @client.reset(endpoint_url)
184
+ raise
185
+ end
186
+ @wiredump_dev << "\n\n" if @wiredump_dev
187
+ receive_string = res.content
188
+ if @wiredump_file_base
189
+ filename = @wiredump_file_base + '_response.xml'
190
+ f = File.open(filename, "w")
191
+ f << receive_string
192
+ f.close
193
+ end
194
+ case res.status
195
+ when 405
196
+ raise PostUnavailableError.new("#{ res.status }: #{ res.reason }")
197
+ when 200, 500
198
+ # Nothing to do.
199
+ else
200
+ raise HTTPStreamError.new("#{ res.status }: #{ res.reason }")
201
+ end
202
+ if res.respond_to?(:header) and !res.header['content-encoding'].empty? and
203
+ res.header['content-encoding'][0].downcase == 'gzip'
204
+ receive_string = decode_gzip(receive_string)
205
+ end
206
+ conn_data.receive_string = receive_string
207
+ conn_data.receive_contenttype = res.contenttype
208
+ conn_data
209
+ end
210
+
211
+ def send_accept_encoding_gzip?
212
+ @accept_encoding_gzip and defined?(::Zlib)
213
+ end
214
+
215
+ def decode_gzip(instring)
216
+ unless send_accept_encoding_gzip?
217
+ raise HTTPStreamError.new("Gzipped response content.")
218
+ end
219
+ begin
220
+ gz = Zlib::GzipReader.new(StringIO.new(instring))
221
+ gz.read
222
+ ensure
223
+ gz.close
224
+ end
225
+ end
226
+ end
227
+
228
+
229
+ end