soap4r 1.5.5.20061022 → 1.5.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. data/bin/wsdl2ruby.rb +8 -8
  2. data/lib/soap/XMLSchemaDatatypes.rb +1 -1
  3. data/lib/soap/XMLSchemaDatatypes1999.rb +1 -1
  4. data/lib/soap/attachment.rb +1 -1
  5. data/lib/soap/baseData.rb +102 -54
  6. data/lib/soap/cgistub.rb +1 -1
  7. data/lib/soap/charset.rb +1 -1
  8. data/lib/soap/driver.rb +1 -1
  9. data/lib/soap/element.rb +20 -12
  10. data/lib/soap/encodingstyle/aspDotNetHandler.rb +2 -2
  11. data/lib/soap/encodingstyle/handler.rb +1 -1
  12. data/lib/soap/encodingstyle/literalHandler.rb +29 -73
  13. data/lib/soap/encodingstyle/soapHandler.rb +8 -7
  14. data/lib/soap/filter.rb +10 -0
  15. data/lib/soap/filter/filterchain.rb +51 -0
  16. data/lib/soap/filter/handler.rb +31 -0
  17. data/lib/soap/generator.rb +11 -3
  18. data/lib/soap/header/handler.rb +6 -5
  19. data/lib/soap/header/handlerset.rb +7 -7
  20. data/lib/soap/header/simplehandler.rb +1 -1
  21. data/lib/soap/httpconfigloader.rb +7 -2
  22. data/lib/soap/mapping.rb +1 -1
  23. data/lib/soap/mapping/encodedregistry.rb +36 -26
  24. data/lib/soap/mapping/encodedregistry.rb~ +531 -0
  25. data/lib/soap/mapping/factory.rb +2 -2
  26. data/lib/soap/mapping/literalregistry.rb +107 -67
  27. data/lib/soap/mapping/mapping.rb +92 -112
  28. data/lib/soap/mapping/registry.rb +25 -8
  29. data/lib/soap/mapping/rubytypeFactory.rb +1 -1
  30. data/lib/soap/mapping/schemadefinition.rb +163 -0
  31. data/lib/soap/mapping/typeMap.rb +7 -1
  32. data/lib/soap/mapping/wsdlencodedregistry.rb +2 -2
  33. data/lib/soap/mapping/wsdlliteralregistry.rb +14 -23
  34. data/lib/soap/mappingRegistry.rb +1 -1
  35. data/lib/soap/marshal.rb +1 -1
  36. data/lib/soap/namespace.rb +1 -1
  37. data/lib/soap/netHttpClient.rb +43 -13
  38. data/lib/soap/parser.rb +40 -42
  39. data/lib/soap/processor.rb +1 -1
  40. data/lib/soap/property.rb +7 -7
  41. data/lib/soap/proxy.rb +1 -1
  42. data/lib/soap/qname.rb +1 -1
  43. data/lib/soap/rpc/cgistub.rb +34 -1
  44. data/lib/soap/rpc/driver.rb +2 -1
  45. data/lib/soap/rpc/element.rb +42 -15
  46. data/lib/soap/rpc/httpserver.rb +13 -1
  47. data/lib/soap/rpc/proxy.rb +51 -41
  48. data/lib/soap/rpc/router.rb +88 -33
  49. data/lib/soap/rpc/rpc.rb +1 -1
  50. data/lib/soap/rpc/soaplet.rb +51 -3
  51. data/lib/soap/rpc/standaloneServer.rb +1 -1
  52. data/lib/soap/rpcRouter.rb +1 -1
  53. data/lib/soap/rpcUtils.rb +1 -1
  54. data/lib/soap/server.rb +1 -1
  55. data/lib/soap/soap.rb +2 -2
  56. data/lib/soap/standaloneServer.rb +1 -1
  57. data/lib/soap/streamHandler.rb +13 -4
  58. data/lib/soap/wsdlDriver.rb +11 -15
  59. data/lib/tags +5144 -0
  60. data/lib/wsdl/binding.rb +1 -1
  61. data/lib/wsdl/data.rb +1 -1
  62. data/lib/wsdl/definitions.rb +1 -1
  63. data/lib/wsdl/documentation.rb +1 -1
  64. data/lib/wsdl/import.rb +1 -1
  65. data/lib/wsdl/importer.rb +1 -1
  66. data/lib/wsdl/info.rb +1 -1
  67. data/lib/wsdl/message.rb +1 -1
  68. data/lib/wsdl/operation.rb +10 -7
  69. data/lib/wsdl/operationBinding.rb +19 -5
  70. data/lib/wsdl/param.rb +11 -3
  71. data/lib/wsdl/parser.rb +4 -3
  72. data/lib/wsdl/part.rb +1 -1
  73. data/lib/wsdl/port.rb +1 -1
  74. data/lib/wsdl/portType.rb +1 -1
  75. data/lib/wsdl/service.rb +1 -1
  76. data/lib/wsdl/soap/address.rb +1 -1
  77. data/lib/wsdl/soap/binding.rb +1 -1
  78. data/lib/wsdl/soap/body.rb +3 -1
  79. data/lib/wsdl/soap/cgiStubCreator.rb +1 -1
  80. data/lib/wsdl/soap/classDefCreator.rb +78 -14
  81. data/lib/wsdl/soap/classDefCreatorSupport.rb +28 -11
  82. data/lib/wsdl/soap/clientSkeltonCreator.rb +3 -2
  83. data/lib/wsdl/soap/complexType.rb +8 -11
  84. data/lib/wsdl/soap/data.rb +1 -1
  85. data/lib/wsdl/soap/definitions.rb +49 -4
  86. data/lib/wsdl/soap/driverCreator.rb +1 -1
  87. data/lib/wsdl/soap/element.rb +3 -2
  88. data/lib/wsdl/soap/encodedMappingRegistryCreator.rb +1 -1
  89. data/lib/wsdl/soap/fault.rb +1 -1
  90. data/lib/wsdl/soap/header.rb +1 -1
  91. data/lib/wsdl/soap/headerfault.rb +1 -1
  92. data/lib/wsdl/soap/literalMappingRegistryCreator.rb +41 -21
  93. data/lib/wsdl/soap/mappingRegistryCreator.rb +2 -1
  94. data/lib/wsdl/soap/mappingRegistryCreatorSupport.rb +45 -19
  95. data/lib/wsdl/soap/methodDefCreator.rb +28 -17
  96. data/lib/wsdl/soap/operation.rb +11 -11
  97. data/lib/wsdl/soap/servantSkeltonCreator.rb +3 -2
  98. data/lib/wsdl/soap/standaloneServerStubCreator.rb +1 -1
  99. data/lib/wsdl/soap/wsdl2ruby.rb +8 -2
  100. data/lib/wsdl/types.rb +1 -1
  101. data/lib/wsdl/wsdl.rb +1 -1
  102. data/lib/wsdl/xmlSchema/all.rb +1 -1
  103. data/lib/wsdl/xmlSchema/annotation.rb +1 -1
  104. data/lib/wsdl/xmlSchema/any.rb +10 -5
  105. data/lib/wsdl/xmlSchema/attribute.rb +1 -1
  106. data/lib/wsdl/xmlSchema/choice.rb +1 -1
  107. data/lib/wsdl/xmlSchema/complexContent.rb +11 -2
  108. data/lib/wsdl/xmlSchema/complexExtension.rb +8 -1
  109. data/lib/wsdl/xmlSchema/complexRestriction.rb +6 -2
  110. data/lib/wsdl/xmlSchema/complexType.rb +9 -1
  111. data/lib/wsdl/xmlSchema/content.rb +26 -5
  112. data/lib/wsdl/xmlSchema/data.rb +4 -1
  113. data/lib/wsdl/xmlSchema/element.rb +12 -9
  114. data/lib/wsdl/xmlSchema/enumeration.rb +1 -1
  115. data/lib/wsdl/xmlSchema/import.rb +1 -1
  116. data/lib/wsdl/xmlSchema/importer.rb +9 -6
  117. data/lib/wsdl/xmlSchema/include.rb +1 -1
  118. data/lib/wsdl/xmlSchema/length.rb +1 -1
  119. data/lib/wsdl/xmlSchema/list.rb +1 -1
  120. data/lib/wsdl/xmlSchema/maxlength.rb +1 -1
  121. data/lib/wsdl/xmlSchema/minlength.rb +1 -1
  122. data/lib/wsdl/xmlSchema/parser.rb +4 -3
  123. data/lib/wsdl/xmlSchema/pattern.rb +1 -1
  124. data/lib/wsdl/xmlSchema/schema.rb +1 -1
  125. data/lib/wsdl/xmlSchema/sequence.rb +1 -1
  126. data/lib/wsdl/xmlSchema/simpleContent.rb +1 -1
  127. data/lib/wsdl/xmlSchema/simpleExtension.rb +1 -1
  128. data/lib/wsdl/xmlSchema/simpleRestriction.rb +1 -1
  129. data/lib/wsdl/xmlSchema/simpleType.rb +8 -1
  130. data/lib/wsdl/xmlSchema/union.rb +35 -0
  131. data/lib/wsdl/xmlSchema/unique.rb +1 -1
  132. data/lib/wsdl/xmlSchema/xsd2ruby.rb +6 -1
  133. data/lib/xsd/charset.rb +1 -1
  134. data/lib/xsd/classloader.rb +26 -0
  135. data/lib/xsd/codegen.rb +1 -1
  136. data/lib/xsd/codegen/classdef.rb +1 -1
  137. data/lib/xsd/codegen/commentdef.rb +1 -1
  138. data/lib/xsd/codegen/gensupport.rb +119 -14
  139. data/lib/xsd/codegen/methoddef.rb +1 -1
  140. data/lib/xsd/codegen/moduledef.rb +1 -1
  141. data/lib/xsd/datatypes.rb +52 -13
  142. data/lib/xsd/datatypes1999.rb +1 -1
  143. data/lib/xsd/iconvcharset.rb +1 -1
  144. data/lib/xsd/mapping.rb +1 -1
  145. data/lib/xsd/namedelements.rb +1 -1
  146. data/lib/xsd/ns.rb +2 -2
  147. data/lib/xsd/qname.rb +1 -1
  148. data/lib/xsd/xmlparser.rb +16 -3
  149. data/lib/xsd/xmlparser/parser.rb +6 -2
  150. data/lib/xsd/xmlparser/rexmlparser.rb +5 -1
  151. data/lib/xsd/xmlparser/xmlparser.rb +1 -1
  152. data/lib/xsd/xmlparser/xmlscanner.rb +4 -2
  153. data/test/interopR2/InteropTest.rb +83 -0
  154. data/test/interopR2/InteropTest.wsdl +315 -0
  155. data/test/interopR2/InteropTestC.wsdl +208 -0
  156. data/test/interopR2/InteropTestDriver.rb +328 -0
  157. data/test/interopR2/SOAP4R_SOAPBuildersInteropTest_R2.wsdl +461 -0
  158. data/test/interopR2/SOAP4R_SOAPBuildersInteropTest_R2GroupB.wsdl +20 -0
  159. data/test/interopR2/SOAP4R_SOAPBuildersInteropTest_R2GroupCClient.rb +178 -0
  160. data/test/interopR2/SOAPBuildersInterop_R2GrC.wsdl +17 -0
  161. data/test/interopR2/clientBase.rb +0 -3
  162. data/test/interopR2/groupc.wsdl +17 -0
  163. data/test/interopR2/result_client.NetRemoting.txt +0 -4593
  164. data/test/interopR2/test.sh +9 -9
  165. data/test/runner.rb +1 -3
  166. data/test/soap/asp.net/test_aspdotnet.rb +20 -9
  167. data/test/soap/case/test_mapping.rb +57 -0
  168. data/test/soap/filter/test_filter.rb +146 -0
  169. data/test/soap/literalArrayMapping/test_definedarray.rb +7 -9
  170. data/test/soap/marshal/marshaltestlib.rb +1 -1
  171. data/test/soap/ssl/test_ssl.rb +0 -10
  172. data/test/soap/struct/test_struct.rb +2 -9
  173. data/test/soap/test_basetype.rb +114 -0
  174. data/test/soap/test_empty.rb +26 -2
  175. data/test/soap/test_envelopenamespace.rb +2 -9
  176. data/test/soap/test_extraattr.rb +55 -0
  177. data/test/soap/test_httpconfigloader.rb +17 -0
  178. data/test/soap/test_property.rb +4 -1
  179. data/test/soap/test_response_as_xml.rb +31 -9
  180. data/test/soap/test_soapelement.rb +21 -3
  181. data/test/soap/test_streamhandler.rb +3 -10
  182. data/test/soap/test_styleuse.rb +2 -9
  183. data/test/soap/wsdlDriver/test_calc.rb +3 -20
  184. data/test/soap/wsdlDriver/test_document.rb +2 -9
  185. data/test/soap/wsdlDriver/test_simpletype.rb +2 -9
  186. data/test/testutil.rb +54 -0
  187. data/test/wsdl/abstract/abstract.wsdl +82 -3
  188. data/test/wsdl/abstract/test_abstract.rb +48 -19
  189. data/test/wsdl/any/any.wsdl +63 -0
  190. data/test/wsdl/any/expectedDriver.rb +22 -1
  191. data/test/wsdl/any/expectedEcho.rb +19 -0
  192. data/test/wsdl/any/expectedService.rb +29 -4
  193. data/test/wsdl/any/test_any.rb +36 -31
  194. data/test/wsdl/choice/choice.wsdl +37 -0
  195. data/test/wsdl/choice/test_choice.rb +66 -17
  196. data/test/wsdl/complexcontent/test_echo.rb +7 -18
  197. data/test/wsdl/document/array/test_array.rb +8 -18
  198. data/test/wsdl/document/ping_nosoapaction.wsdl +1 -1
  199. data/test/wsdl/document/test_nosoapaction.rb +2 -9
  200. data/test/wsdl/document/test_number.rb +3 -10
  201. data/test/wsdl/document/test_rpc.rb +96 -21
  202. data/test/wsdl/fault/fault.wsdl +79 -0
  203. data/test/wsdl/fault/multifault.wsdl +96 -0
  204. data/test/wsdl/fault/test_fault.rb +119 -0
  205. data/test/wsdl/fault/test_multifault.rb +134 -0
  206. data/test/wsdl/list/test_list.rb +6 -16
  207. data/test/wsdl/marshal/test_wsdlmarshal.rb +10 -13
  208. data/test/wsdl/oneway/oneway.wsdl +36 -0
  209. data/test/wsdl/oneway/test_oneway.rb +108 -0
  210. data/test/wsdl/overload/test_overload.rb +3 -10
  211. data/test/wsdl/qualified/test_qualified.rb +9 -17
  212. data/test/wsdl/qualified/test_unqualified.rb +14 -21
  213. data/test/wsdl/ref/expectedDriver.rb +51 -0
  214. data/test/wsdl/ref/expectedProduct.rb +71 -71
  215. data/test/wsdl/ref/test_ref.rb +13 -35
  216. data/test/wsdl/rpc/rpc.wsdl +27 -1
  217. data/test/wsdl/rpc/test-rpc-lit-qualified.wsdl +74 -0
  218. data/test/wsdl/rpc/test-rpc-lit.wsdl +11 -4
  219. data/test/wsdl/rpc/test-rpc-lit12.wsdl +455 -0
  220. data/test/wsdl/rpc/test_rpc.rb +20 -19
  221. data/test/wsdl/rpc/test_rpc_lit.rb +82 -29
  222. data/test/wsdl/simplecontent/simplecontent.wsdl +1 -0
  223. data/test/wsdl/simplecontent/test_simplecontent.rb +5 -19
  224. data/test/wsdl/simpletype/rpc/expectedDriver.rb +6 -4
  225. data/test/wsdl/simpletype/rpc/expectedEchoVersion.rb +15 -0
  226. data/test/wsdl/simpletype/rpc/expectedMappingRegistry.rb +64 -0
  227. data/test/wsdl/simpletype/rpc/expectedService.rb +6 -4
  228. data/test/wsdl/simpletype/rpc/rpc.wsdl +18 -0
  229. data/test/wsdl/simpletype/rpc/test_rpc.rb +6 -16
  230. data/test/wsdl/simpletype/simpletype.wsdl +19 -0
  231. data/test/wsdl/simpletype/test_simpletype.rb +2 -9
  232. data/test/wsdl/soap/wsdl2ruby/expectedDriver.rb +6 -4
  233. data/test/wsdl/soap/wsdl2ruby/expectedMappingRegistry.rb +40 -0
  234. data/test/wsdl/soap/wsdl2ruby/expectedService.cgi +6 -4
  235. data/test/wsdl/soap/wsdl2ruby/expectedService.rb +6 -4
  236. data/test/wsdl/soap/wsdl2ruby/section/test_section.rb +5 -6
  237. data/test/wsdl/soap/wsdl2ruby/soapenc/test_soapenc.rb +3 -16
  238. data/test/wsdl/soap/wsdl2ruby/test_wsdl2ruby.rb +9 -17
  239. data/test/wsdl/soaptype/test_soaptype.rb +29 -11
  240. data/test/xsd/test_xsd.rb +115 -1
  241. metadata +421 -454
  242. data/test/interopR2/client.NetRemoting.rb.result +0 -3410
  243. data/test/interopR2/client.NetRemoting_Base.log +0 -6279
  244. data/test/interopR2/client.NetRemoting_GroupB.log +0 -1188
  245. data/test/interopR2/client4S4C2_Base.log +0 -4955
  246. data/test/interopR2/client4S4C2_GroupB.log +0 -1000
  247. data/test/interopR2/client4S4C_Base.log +0 -4635
  248. data/test/interopR2/client4S4C_GroupB.log +0 -900
  249. data/test/interopR2/clientASP.NET_Base.log +0 -5468
  250. data/test/interopR2/clientASP.NET_GroupB.log +0 -977
  251. data/test/interopR2/clientApacheAxis_Base.log +0 -3171
  252. data/test/interopR2/clientApacheAxis_GroupB.log +0 -498
  253. data/test/interopR2/clientApacheSOAP_Base.log +0 -3171
  254. data/test/interopR2/clientBEAWebLogic_Base.log +0 -3171
  255. data/test/interopR2/clientBEAWebLogic_GroupB.log +0 -498
  256. data/test/interopR2/clientCapeConnect_Base.log +0 -2126
  257. data/test/interopR2/clientDelphi_Base.log +0 -0
  258. data/test/interopR2/clientEasySoap_Base.log +0 -6187
  259. data/test/interopR2/clientEasySoap_GroupB.log +0 -1076
  260. data/test/interopR2/clientFrontier_Base.log +0 -5188
  261. data/test/interopR2/clientHP_Base.log +0 -3171
  262. data/test/interopR2/clientHP_GroupB.log +0 -498
  263. data/test/interopR2/clientJSOAP_Base.log +0 -4465
  264. data/test/interopR2/clientJSOAP_GroupB.log +0 -824
  265. data/test/interopR2/clientKafkaXSLT_Base.log +0 -10299
  266. data/test/interopR2/clientKafkaXSLT_GroupB.log +0 -1739
  267. data/test/interopR2/clientMSSOAPToolkit2.0_Base.log +0 -4805
  268. data/test/interopR2/clientMSSOAPToolkit2.0_GroupB.log +0 -871
  269. data/test/interopR2/clientMSSOAPToolkit3.0_Base.log +0 -5076
  270. data/test/interopR2/clientMSSOAPToolkit3.0_GroupB.log +0 -908
  271. data/test/interopR2/clientNuSOAP_Base.log +0 -5076
  272. data/test/interopR2/clientNuSOAP_GroupB.log +0 -958
  273. data/test/interopR2/clientNuWave_Base.log +0 -2019
  274. data/test/interopR2/clientOpenLink_Base.log +0 -6171
  275. data/test/interopR2/clientOpenLink_GroupB.log +0 -1094
  276. data/test/interopR2/clientOracle_Base.log +0 -5594
  277. data/test/interopR2/clientPEAR_Base.log +0 -6261
  278. data/test/interopR2/clientPEAR_GroupB.log +0 -1106
  279. data/test/interopR2/clientPhalanx_Base.log +0 -41036
  280. data/test/interopR2/clientPhalanx_GroupB.log +0 -6519
  281. data/test/interopR2/clientSIMACE_Base.log +0 -6171
  282. data/test/interopR2/clientSIMACE_GroupB.log +0 -1093
  283. data/test/interopR2/clientSOAP4R.rb.result +0 -3409
  284. data/test/interopR2/clientSOAP4R_Base.log +0 -6366
  285. data/test/interopR2/clientSOAP4R_GroupB.log +0 -1112
  286. data/test/interopR2/clientSQLData_Base.log +0 -4857
  287. data/test/interopR2/clientSQLData_GroupB.log +0 -770
  288. data/test/interopR2/clientSilverStream_Base.log +0 -3171
  289. data/test/interopR2/clientSpray2001_Base.log +0 -8187
  290. data/test/interopR2/clientSpray2001_GroupB.log +0 -1408
  291. data/test/interopR2/clientSun_Base.log +0 -4641
  292. data/test/interopR2/clientSun_GroupB.log +0 -856
  293. data/test/interopR2/clientVWOpentalkSoap_Base.log +0 -5402
  294. data/test/interopR2/clientVWOpentalkSoap_GroupB.log +0 -972
  295. data/test/interopR2/clientWASPC_Base.log +0 -4187
  296. data/test/interopR2/clientWASPC_GroupB.log +0 -763
  297. data/test/interopR2/clientWASP_Base.log +0 -5414
  298. data/test/interopR2/clientWASP_GroupB.log +0 -970
  299. data/test/interopR2/clientWebMethods_Base.log +0 -3075
  300. data/test/interopR2/clientWebMethods_GroupB.log +0 -483
  301. data/test/interopR2/clientWhiteMesa_Base.log +0 -4359
  302. data/test/interopR2/clientWhiteMesa_GroupB.log +0 -808
  303. data/test/interopR2/clientWingfoot_Base.log +0 -4445
  304. data/test/interopR2/clientWingfoot_GroupB.log +0 -848
  305. data/test/interopR2/clientXMLBus_Base.log +0 -3075
  306. data/test/interopR2/clientXMLBus_GroupB.log +0 -483
  307. data/test/interopR2/clientXSOAP_Base.log +0 -4445
  308. data/test/interopR2/clienteSOAP_Base.log +0 -8728
  309. data/test/interopR2/clientgSOAP_Base.log +0 -4689
  310. data/test/interopR2/clientgSOAP_GroupB.log +0 -1014
  311. data/test/interopR2/clientkSOAP_Base.log +0 -5625
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - RPC Proxy library.
2
- # Copyright (C) 2000, 2003-2006 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -12,6 +12,8 @@ require 'soap/mapping'
12
12
  require 'soap/mapping/literalregistry'
13
13
  require 'soap/rpc/rpc'
14
14
  require 'soap/rpc/element'
15
+ require 'soap/header/handlerset'
16
+ require 'soap/filter'
15
17
  require 'soap/streamHandler'
16
18
  require 'soap/mimemessage'
17
19
 
@@ -32,6 +34,7 @@ public
32
34
  attr_accessor :generate_explicit_type
33
35
  attr_accessor :return_response_as_xml
34
36
  attr_reader :headerhandler
37
+ attr_reader :filterchain
35
38
  attr_reader :streamhandler
36
39
 
37
40
  attr_accessor :mapping_registry
@@ -54,6 +57,7 @@ public
54
57
  @generate_explicit_type = true
55
58
  @return_response_as_xml = false
56
59
  @headerhandler = Header::HandlerSet.new
60
+ @filterchain = Filter::FilterChain.new
57
61
  @mapping_registry = nil
58
62
  @literal_mapping_registry = ::SOAP::Mapping::LiteralRegistry.new
59
63
  end
@@ -84,20 +88,14 @@ public
84
88
  end
85
89
 
86
90
  def add_rpc_operation(qname, soapaction, name, param_def, opt = {})
91
+ ensure_styleuse_option(opt, :rpc, :encoded)
87
92
  opt[:request_qname] = qname
88
- opt[:request_style] ||= :rpc
89
- opt[:response_style] ||= :rpc
90
- opt[:request_use] ||= :encoded
91
- opt[:response_use] ||= :encoded
92
93
  op = Operation.new(soapaction, param_def, opt)
93
94
  assign_operation(name, qname, soapaction, op)
94
95
  end
95
96
 
96
97
  def add_document_operation(soapaction, name, param_def, opt = {})
97
- opt[:request_style] ||= :document
98
- opt[:response_style] ||= :document
99
- opt[:request_use] ||= :literal
100
- opt[:response_use] ||= :literal
98
+ ensure_styleuse_option(opt, :document, :literal)
101
99
  op = Operation.new(soapaction, param_def, opt)
102
100
  assign_operation(name, nil, soapaction, op)
103
101
  end
@@ -142,6 +140,9 @@ public
142
140
  :attributeformdefault => op_info.attributeformdefault
143
141
  )
144
142
  env = route(req_header, req_body, reqopt, resopt)
143
+ if op_info.response_use.nil?
144
+ return nil
145
+ end
145
146
  raise EmptyResponseError unless env
146
147
  receive_headers(env.header)
147
148
  begin
@@ -190,6 +191,17 @@ public
190
191
 
191
192
  private
192
193
 
194
+ def ensure_styleuse_option(opt, style, use)
195
+ if opt[:request_style] || opt[:response_style] || opt[:request_use] || opt[:response_use]
196
+ # do not edit
197
+ else
198
+ opt[:request_style] ||= style
199
+ opt[:response_style] ||= style
200
+ opt[:request_use] ||= use
201
+ opt[:response_use] ||= use
202
+ end
203
+ end
204
+
193
205
  def initialize_streamhandler(options)
194
206
  value = options["streamhandler"]
195
207
  if value and !value.empty?
@@ -223,29 +235,30 @@ private
223
235
  end
224
236
 
225
237
  def create_request_header
226
- headers = @headerhandler.on_outbound
227
- if headers.empty?
228
- nil
229
- else
230
- h = ::SOAP::SOAPHeader.new
231
- headers.each do |header|
232
- h.add(header.elename.name, header)
233
- end
234
- h
238
+ header = ::SOAP::SOAPHeader.new
239
+ items = @headerhandler.on_outbound(header)
240
+ items.each do |item|
241
+ header.add(item.elename.name, item)
235
242
  end
243
+ header
236
244
  end
237
245
 
238
- def receive_headers(headers)
239
- @headerhandler.on_inbound(headers) if headers
246
+ def receive_headers(header)
247
+ @headerhandler.on_inbound(header) if header
240
248
  end
241
249
 
242
250
  def marshal(env, opt)
251
+ @filterchain.each do |filter|
252
+ env = filter.on_outbound(env, opt)
253
+ break unless env
254
+ end
243
255
  send_string = Processor.marshal(env, opt)
244
256
  StreamHandler::ConnectionData.new(send_string)
245
257
  end
246
258
 
247
259
  def unmarshal(conn_data, opt)
248
260
  contenttype = conn_data.receive_contenttype
261
+ xml = nil
249
262
  if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
250
263
  opt[:external_content] = {}
251
264
  mime = MIMEMessage.parse("Content-Type: " + contenttype,
@@ -258,17 +271,19 @@ private
258
271
  end
259
272
  opt[:charset] = @mandatorycharset ||
260
273
  StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
261
- env = Processor.unmarshal(mime.root.content, opt)
262
- if @return_response_as_xml
263
- opt[:response_as_xml] = mime.root.content
264
- end
274
+ xml = mime.root.content
265
275
  else
266
276
  opt[:charset] = @mandatorycharset ||
267
277
  ::SOAP::StreamHandler.parse_media_type(contenttype)
268
- env = Processor.unmarshal(conn_data.receive_string, opt)
269
- if @return_response_as_xml
270
- opt[:response_as_xml] = conn_data.receive_string
271
- end
278
+ xml = conn_data.receive_string
279
+ end
280
+ @filterchain.reverse_each do |filter|
281
+ xml = filter.on_inbound(xml, opt)
282
+ break unless xml
283
+ end
284
+ env = Processor.unmarshal(xml, opt)
285
+ if @return_response_as_xml
286
+ opt[:response_as_xml] = xml
272
287
  end
273
288
  unless env.is_a?(::SOAP::SOAPEnvelope)
274
289
  raise ResponseFormatError.new("response is not a SOAP envelope: #{env}")
@@ -430,8 +445,9 @@ private
430
445
  end
431
446
  end
432
447
 
448
+ # nil means oneway
433
449
  def check_use(use)
434
- unless [:encoded, :literal].include?(use)
450
+ unless [:encoded, :literal, nil].include?(use)
435
451
  raise MethodDefinitionError.new("unknown use: #{use}")
436
452
  end
437
453
  end
@@ -455,8 +471,12 @@ private
455
471
  def request_rpc_enc(values, mapping_registry, opt)
456
472
  method = @rpc_method_factory.dup
457
473
  names = method.input_params
458
- obj = create_request_obj(names, values)
459
- soap = Mapping.obj2soap(obj, mapping_registry, @rpc_request_qname, opt)
474
+ types = method.input_param_types
475
+ ary = Mapping.objs2soap(values, mapping_registry, types, opt)
476
+ soap = {}
477
+ 0.upto(ary.length - 1) do |idx|
478
+ soap[names[idx]] = ary[idx]
479
+ end
460
480
  method.set_param(soap)
461
481
  method
462
482
  end
@@ -545,16 +565,6 @@ private
545
565
  Mapping.soap2obj(value, mapping_registry)
546
566
  }
547
567
  end
548
-
549
- def create_request_obj(names, params)
550
- o = Object.new
551
- idx = 0
552
- while idx < params.length
553
- o.instance_variable_set('@' + names[idx], params[idx])
554
- idx += 1
555
- end
556
- o
557
- end
558
568
  end
559
569
  end
560
570
 
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - RPC Routing library
2
- # Copyright (C) 2001, 2002, 2004-2006 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -12,6 +12,8 @@ require 'soap/mapping'
12
12
  require 'soap/mapping/literalregistry'
13
13
  require 'soap/rpc/rpc'
14
14
  require 'soap/rpc/element'
15
+ require 'soap/header/handlerset'
16
+ require 'soap/filter'
15
17
  require 'soap/streamHandler'
16
18
  require 'soap/mimemessage'
17
19
  require 'soap/header/handlerset'
@@ -29,6 +31,7 @@ class Router
29
31
  attr_accessor :literal_mapping_registry
30
32
  attr_accessor :generate_explicit_type
31
33
  attr_accessor :external_ces
34
+ attr_reader :filterchain
32
35
 
33
36
  def initialize(actor)
34
37
  @actor = actor
@@ -40,6 +43,7 @@ class Router
40
43
  @operation_by_soapaction = {}
41
44
  @operation_by_qname = {}
42
45
  @headerhandlerfactory = []
46
+ @filterchain = Filter::FilterChain.new
43
47
  end
44
48
 
45
49
  ###
@@ -167,23 +171,38 @@ class Router
167
171
  soap_response =
168
172
  op.call(env.body, @mapping_registry, @literal_mapping_registry,
169
173
  create_mapping_opt)
174
+ conn_data.is_fault = true if soap_response.is_a?(SOAPFault)
170
175
  default_encodingstyle = op.response_default_encodingstyle
171
- rescue Exception
172
- soap_response = fault($!)
176
+ rescue Exception => e
177
+ # If a wsdl fault was raised by service, the fault declaration details
178
+ # is kept in wsdl_fault. Otherwise (exception is a program fault)
179
+ # wsdl_fault is nil
180
+ wsdl_fault_details = op.faults && op.faults[e.class.name]
181
+ soap_response = fault(e, wsdl_fault_details)
182
+ conn_data.is_fault = true
173
183
  default_encodingstyle = nil
174
184
  end
175
- conn_data.is_fault = true if soap_response.is_a?(SOAPFault)
176
185
  header = call_headers(headerhandler)
177
- body = SOAPBody.new(soap_response)
178
- env = SOAPEnvelope.new(header, body)
179
- marshal(conn_data, env, default_encodingstyle)
186
+ if op.response_use.nil?
187
+ conn_data.send_string = ''
188
+ conn_data.is_nocontent = true
189
+ conn_data
190
+ else
191
+ body = SOAPBody.new(soap_response, conn_data.is_fault)
192
+ env = SOAPEnvelope.new(header, body)
193
+ marshal(conn_data, env, default_encodingstyle)
194
+ end
180
195
  end
181
196
 
182
197
  # Create fault response string.
183
198
  def create_fault_response(e)
184
- env = SOAPEnvelope.new(SOAPHeader.new, SOAPBody.new(fault(e)))
199
+ env = SOAPEnvelope.new(SOAPHeader.new, SOAPBody.new(fault(e, nil), true))
185
200
  opt = {}
186
201
  opt[:external_content] = nil
202
+ @filterchain.reverse_each do |filter|
203
+ env = filter.on_outbound(env, opt)
204
+ break unless env
205
+ end
187
206
  response_string = Processor.marshal(env, opt)
188
207
  conn_data = StreamHandler::ConnectionData.new(response_string)
189
208
  conn_data.is_fault = true
@@ -213,10 +232,14 @@ private
213
232
  end
214
233
 
215
234
  def ensure_styleuse_option(opt, style, use)
216
- opt[:request_style] ||= style
217
- opt[:response_style] ||= style
218
- opt[:request_use] ||= use
219
- opt[:response_use] ||= use
235
+ if opt[:request_style] || opt[:response_style] || opt[:request_use] || opt[:response_use]
236
+ # do not edit
237
+ else
238
+ opt[:request_style] ||= style
239
+ opt[:response_style] ||= style
240
+ opt[:request_use] ||= use
241
+ opt[:response_use] ||= use
242
+ end
220
243
  end
221
244
 
222
245
  def assign_operation(soapaction, qname, op)
@@ -251,23 +274,20 @@ private
251
274
  end
252
275
 
253
276
  def call_headers(headerhandler)
254
- headers = headerhandler.on_outbound
255
- if headers.empty?
256
- nil
257
- else
258
- h = ::SOAP::SOAPHeader.new
259
- headers.each do |header|
260
- h.add(header.elename.name, header)
261
- end
262
- h
277
+ header = ::SOAP::SOAPHeader.new
278
+ items = headerhandler.on_outbound(header)
279
+ items.each do |item|
280
+ header.add(item.elename.name, item)
263
281
  end
282
+ header
264
283
  end
265
284
 
266
- def receive_headers(headerhandler, headers)
267
- headerhandler.on_inbound(headers) if headers
285
+ def receive_headers(headerhandler, header)
286
+ headerhandler.on_inbound(header) if header
268
287
  end
269
288
 
270
289
  def unmarshal(conn_data)
290
+ xml = nil
271
291
  opt = {}
272
292
  contenttype = conn_data.receive_contenttype
273
293
  if /#{MIMEMessage::MultipartContentType}/i =~ contenttype
@@ -282,11 +302,16 @@ private
282
302
  end
283
303
  opt[:charset] =
284
304
  StreamHandler.parse_media_type(mime.root.headers['content-type'].str)
285
- env = Processor.unmarshal(mime.root.content, opt)
305
+ xml = mime.root.content
286
306
  else
287
307
  opt[:charset] = ::SOAP::StreamHandler.parse_media_type(contenttype)
288
- env = Processor.unmarshal(conn_data.receive_string, opt)
308
+ xml = conn_data.receive_string
289
309
  end
310
+ @filterchain.each do |filter|
311
+ xml = filter.on_inbound(xml, opt)
312
+ break unless xml
313
+ end
314
+ env = Processor.unmarshal(xml, opt)
290
315
  charset = opt[:charset]
291
316
  conn_data.send_contenttype = "text/xml; charset=\"#{charset}\""
292
317
  env
@@ -297,6 +322,10 @@ private
297
322
  opt[:external_content] = nil
298
323
  opt[:default_encodingstyle] = default_encodingstyle
299
324
  opt[:generate_explicit_type] = @generate_explicit_type
325
+ @filterchain.reverse_each do |filter|
326
+ env = filter.on_outbound(env, opt)
327
+ break unless env
328
+ end
300
329
  response_string = Processor.marshal(env, opt)
301
330
  conn_data.send_string = response_string
302
331
  if ext = opt[:external_content]
@@ -318,15 +347,36 @@ private
318
347
  end
319
348
 
320
349
  # Create fault response.
321
- def fault(e)
350
+ def fault(e, wsdl_fault_details)
322
351
  if e.is_a?(UnhandledMustUnderstandHeaderError)
323
352
  faultcode = FaultCode::MustUnderstand
324
353
  else
325
354
  faultcode = FaultCode::Server
326
355
  end
327
- detail = Mapping.obj2soap(Mapping::SOAPException.new(e),
328
- @mapping_registry)
329
- detail.elename ||= XSD::QName::EMPTY # for literal mappingregstry
356
+
357
+ # If the exception represents a WSDL fault, the fault element should
358
+ # be added as the SOAP fault <detail> element. If the exception is a
359
+ # normal program exception, it is wrapped inside a custom SOAP4R
360
+ # SOAP exception element.
361
+ detail = nil
362
+ if (wsdl_fault_details)
363
+ registry = wsdl_fault_details[:use] == "literal" ?
364
+ @literal_mapping_registry : @mapping_registry
365
+ faultQName = XSD::QName.new(
366
+ wsdl_fault_details[:ns], wsdl_fault_details[:name]
367
+ )
368
+ detail = Mapping.obj2soap(e, registry, faultQName)
369
+ # wrap fault element (SOAPFault swallows top-level element)
370
+ wrapper = SOAP::SOAPElement.new(faultQName)
371
+ wrapper.add(detail)
372
+ detail = wrapper
373
+ else
374
+ # Exception is a normal program exception. Wrap it.
375
+ detail = Mapping.obj2soap(Mapping::SOAPException.new(e),
376
+ @mapping_registry)
377
+ detail.elename ||= XSD::QName::EMPTY # for literal mappingregstry
378
+ end
379
+
330
380
  SOAPFault.new(
331
381
  SOAPElement.new(nil, faultcode),
332
382
  SOAPString.new(e.to_s),
@@ -345,6 +395,7 @@ private
345
395
  attr_reader :response_style
346
396
  attr_reader :request_use
347
397
  attr_reader :response_use
398
+ attr_reader :faults
348
399
 
349
400
  def initialize(soapaction, name, param_def, opt)
350
401
  @soapaction = soapaction
@@ -353,6 +404,7 @@ private
353
404
  @response_style = opt[:response_style]
354
405
  @request_use = opt[:request_use]
355
406
  @response_use = opt[:response_use]
407
+ @faults = opt[:faults]
356
408
  check_style(@request_style)
357
409
  check_style(@response_style)
358
410
  check_use(@request_use)
@@ -405,6 +457,8 @@ private
405
457
  return result if result.is_a?(SOAPFault)
406
458
  if @response_style == :rpc
407
459
  response_rpc(result, mapping_registry, literal_mapping_registry, opt)
460
+ elsif @doc_response_qnames.empty?
461
+ # nothing to do
408
462
  else
409
463
  response_doc(result, mapping_registry, literal_mapping_registry, opt)
410
464
  end
@@ -469,7 +523,7 @@ private
469
523
  response_rpc_lit(result, literal_mapping_registry, opt)
470
524
  end
471
525
  end
472
-
526
+
473
527
  def response_doc(result, mapping_registry, literal_mapping_registry, opt)
474
528
  if @doc_response_qnames.size == 0
475
529
  result = []
@@ -527,10 +581,10 @@ private
527
581
  end
528
582
  soap_response.set_outparam(outparams)
529
583
  soap_response.retval = Mapping.obj2soap(result[0], mapping_registry,
530
- XSD::QName.new(nil, soap_response.elename), opt)
584
+ soap_response.elename, opt)
531
585
  else
532
586
  soap_response.retval = Mapping.obj2soap(result, mapping_registry,
533
- XSD::QName.new(nil, soap_response.elename), opt)
587
+ soap_response.elename, opt)
534
588
  end
535
589
  soap_response
536
590
  end
@@ -560,8 +614,9 @@ private
560
614
  end
561
615
  end
562
616
 
617
+ # nil means oneway
563
618
  def check_use(use)
564
- unless [:encoded, :literal].include?(use)
619
+ unless [:encoded, :literal, nil].include?(use)
565
620
  raise ArgumentError.new("unknown use: #{use}")
566
621
  end
567
622
  end
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - RPC utility.
2
- # Copyright (C) 2003 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -1,5 +1,5 @@
1
1
  # SOAP4R - SOAP handler servlet for WEBrick
2
- # Copyright (C) 2001-2005 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
2
+ # Copyright (C) 2000-2007 NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
3
3
 
4
4
  # This program is copyrighted free software by NAKAMURA, Hiroshi. You can
5
5
  # redistribute it and/or modify it under the same terms of Ruby's license;
@@ -41,10 +41,12 @@ module RPC
41
41
  class SOAPlet < WEBrick::HTTPServlet::AbstractServlet
42
42
  public
43
43
  attr_reader :options
44
+ attr_accessor :authenticator
44
45
 
45
46
  def initialize(router = nil)
46
47
  @router = router || ::SOAP::RPC::Router.new(self.class.name)
47
48
  @options = {}
49
+ @authenticator = nil
48
50
  @config = {}
49
51
  end
50
52
 
@@ -81,12 +83,20 @@ public
81
83
 
82
84
  def do_POST(req, res)
83
85
  logger.debug { "SOAP request: " + req.body } if logger
86
+ if @authenticator
87
+ @authenticator.authenticate(req, res)
88
+ # you can check authenticated user with SOAP::RPC::SOAPlet.user
89
+ end
84
90
  begin
85
91
  conn_data = ::SOAP::StreamHandler::ConnectionData.new
86
92
  setup_req(conn_data, req)
87
93
  @router.external_ces = @options[:external_ces]
88
- conn_data = @router.route(conn_data)
89
- setup_res(conn_data, req, res)
94
+ Mapping.protect_threadvars(:SOAPlet) do
95
+ SOAPlet.user = req.user
96
+ SOAPlet.cookies = req.cookies
97
+ conn_data = @router.route(conn_data)
98
+ setup_res(conn_data, req, res)
99
+ end
90
100
  rescue Exception => e
91
101
  conn_data = @router.create_fault_response(e)
92
102
  res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
@@ -101,8 +111,37 @@ public
101
111
  end
102
112
  end
103
113
 
114
+ def self.cookies
115
+ get_variable(:Cookies)
116
+ end
117
+
118
+ def self.cookies=(cookies)
119
+ set_variable(:Cookies, cookies)
120
+ end
121
+
122
+ def self.user
123
+ get_variable(:User)
124
+ end
125
+
126
+ def self.user=(user)
127
+ set_variable(:User, user)
128
+ end
129
+
104
130
  private
105
131
 
132
+ def self.get_variable(name)
133
+ if var = Thread.current[:SOAPlet]
134
+ var[name]
135
+ else
136
+ nil
137
+ end
138
+ end
139
+
140
+ def self.set_variable(name, value)
141
+ var = Thread.current[:SOAPlet] ||= {}
142
+ var[name] = value
143
+ end
144
+
106
145
  def logger
107
146
  @config[:Logger]
108
147
  end
@@ -115,6 +154,15 @@ private
115
154
 
116
155
  def setup_res(conn_data, req, res)
117
156
  res['content-type'] = conn_data.send_contenttype
157
+ cookies = SOAPlet.cookies
158
+ unless cookies.empty?
159
+ res['set-cookie'] = cookies.collect { |cookie| cookie.to_s }
160
+ end
161
+ if conn_data.is_nocontent
162
+ res.status = WEBrick::HTTPStatus::RC_ACCEPTED
163
+ res.body = ''
164
+ return
165
+ end
118
166
  if conn_data.is_fault
119
167
  res.status = WEBrick::HTTPStatus::RC_INTERNAL_SERVER_ERROR
120
168
  end