johnreitano-savon 0.7.2.1 → 0.7.7.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/savon/wsdl.rb CHANGED
@@ -1,13 +1,79 @@
1
1
  module Savon
2
2
 
3
- # Savon::WSDL
3
+ # = Savon::WSDL
4
4
  #
5
- # Represents the WSDL document.
5
+ # Savon::WSDL represents the WSDL of your service, including information like the namespace URI,
6
+ # the SOAP endpoint and available SOAP actions.
7
+ #
8
+ # == The WSDL document
9
+ #
10
+ # Retrieve the raw WSDL document:
11
+ #
12
+ # client.wsdl.to_s
13
+ #
14
+ # == Available SOAP actions
15
+ #
16
+ # Get an array of available SOAP actions:
17
+ #
18
+ # client.wsdl.soap_actions
19
+ # # => [:get_all_users, :get_user_by_id]
20
+ #
21
+ # == Namespace URI
22
+ #
23
+ # Get the namespace URI:
24
+ #
25
+ # client.wsdl.namespace_uri
26
+ # # => "http://ws.userservice.example.com"
27
+ #
28
+ # == SOAP endpoint
29
+ #
30
+ # Get the SOAP endpoint:
31
+ #
32
+ # client.wsdl.soap_endpoint
33
+ # # => "http://example.com"
34
+ #
35
+ # == Disable Savon::WSDL
36
+ #
37
+ # Especially with large services (i.e. Ebay), getting and parsing the WSDL document can really
38
+ # slow down your request. The WSDL is great for exploring a service, but it's recommended to
39
+ # disable it for production.
40
+ #
41
+ # When disabling the WSDL, you need to pay attention to certain differences:
42
+ #
43
+ # 1. You instantiate Savon::Client with the actual SOAP endpoint instead of pointing it to the
44
+ # WSDL of your service.
45
+ # 2. You also need to manually specify the SOAP.namespace.
46
+ # 3. Append an exclamation mark (!) to your SOAP call:
47
+ #
48
+ # client = Savon::Client.new "http://example.com"
49
+ #
50
+ # client.get_user_by_id! do |soap|
51
+ # soap.namespace = "http://example.com/UserService"
52
+ # soap.body = { :id => 666 }
53
+ # end
54
+ #
55
+ # Without the WSDL, Savon also has to guess the name of the SOAP action and input tag. It takes
56
+ # the name of the method called on its client instance, converts it from snake_case to lowerCamelCase
57
+ # and uses the result.
58
+ #
59
+ # The example above expects a SOAP action with an original name of "getUserById". If you service
60
+ # uses UpperCamelCase method names, you can just use the original name:
61
+ #
62
+ # client.GetAllUsers!
63
+ #
64
+ # For special cases, you could also specify the SOAP.action and SOAP.input inside the block:
65
+ #
66
+ # client.get_user_by_id! do |soap|
67
+ # soap.namespace = "http://example.com/UserService"
68
+ # soap.action = "GetUserById"
69
+ # soap.input = "GetUserByIdRequest"
70
+ # soap.body = { :id => 123 }
71
+ # end
6
72
  class WSDL
7
73
 
8
74
  # Initializer, expects a Savon::Request.
9
75
  def initialize(request)
10
- @request = request
76
+ @request, @enabled = request, true
11
77
  end
12
78
 
13
79
  # Sets whether to use the WSDL.
@@ -15,7 +81,7 @@ module Savon
15
81
 
16
82
  # Returns whether to use the WSDL. Defaults to +true+.
17
83
  def enabled?
18
- @enabled.nil? ? true : @enabled
84
+ @enabled
19
85
  end
20
86
 
21
87
  # Returns the namespace URI of the WSDL.
@@ -41,10 +107,16 @@ module Savon
41
107
 
42
108
  # Returns +true+ for available methods and SOAP actions.
43
109
  def respond_to?(method)
44
- return true if soap_actions.include? method
110
+ return true if !enabled? || soap_actions.include?(method)
45
111
  super
46
112
  end
47
113
 
114
+ # Returns an Array containg the SOAP action and input for a given +soap_call+.
115
+ def operation_from(soap_action)
116
+ return [soap_action.to_soap_key, soap_action.to_soap_key] unless enabled?
117
+ [operations[soap_action][:action], operations[soap_action][:input]]
118
+ end
119
+
48
120
  # Returns the raw WSDL document.
49
121
  def to_s
50
122
  @document ||= @request.wsdl.body
@@ -62,61 +134,4 @@ module Savon
62
134
  end
63
135
 
64
136
  end
65
-
66
- # Savon::WSDLStream
67
- #
68
- # Stream listener for parsing the WSDL document.
69
- class WSDLStream
70
-
71
- # The main sections of a WSDL document.
72
- Sections = %w(definitions types message portType binding service)
73
-
74
- def initialize
75
- @depth, @operations = 0, {}
76
- end
77
-
78
- # Returns the namespace URI.
79
- attr_reader :namespace_uri
80
-
81
- # Returns the SOAP operations.
82
- attr_reader :operations
83
-
84
- # Returns the SOAP endpoint.
85
- attr_reader :soap_endpoint
86
-
87
- # Hook method called when the stream parser encounters a starting tag.
88
- def tag_start(tag, attrs)
89
- @depth += 1
90
- tag = tag.strip_namespace
91
-
92
- @section = tag.to_sym if @depth <= 2 && Sections.include?(tag)
93
- @namespace_uri ||= attrs["targetNamespace"] if @section == :definitions
94
- @soap_endpoint ||= URI(attrs["location"]) if @section == :service && tag == "address"
95
-
96
- operation_from tag, attrs if @section == :binding && tag == "operation"
97
- end
98
-
99
- # Hook method called when the stream parser encounters a closing tag.
100
- def tag_end(tag)
101
- @depth -= 1
102
- end
103
-
104
- # Stores available operations from a given tag +name+ and +attrs+.
105
- def operation_from(tag, attrs)
106
- @input = attrs["name"] if attrs["name"]
107
-
108
- if attrs["soapAction"]
109
- @action = !attrs["soapAction"].blank? ? attrs["soapAction"] : @input
110
- @input = @action.split("/").last if !@input || @input.empty?
111
-
112
- @operations[@input.snakecase.to_sym] = { :action => @action, :input => @input }
113
- @input, @action = nil, nil
114
- end
115
- end
116
-
117
- # Catches calls to unimplemented hook methods.
118
- def method_missing(method, *args)
119
- end
120
-
121
- end
122
137
  end
@@ -0,0 +1,85 @@
1
+ module Savon
2
+
3
+ # = Savon::WSDLStream
4
+ #
5
+ # Savon::WSDLStream serves as a stream listener for parsing the WSDL document.
6
+ class WSDLStream
7
+
8
+ # The main sections of a WSDL document.
9
+ Sections = %w(definitions types message portType binding service)
10
+
11
+ def initialize
12
+ @path, @operations, @namespaces = [], {}, {}
13
+ end
14
+
15
+ # Returns the namespace URI.
16
+ attr_reader :namespace_uri
17
+
18
+ # Returns the SOAP operations.
19
+ attr_reader :operations
20
+
21
+ # Returns the SOAP endpoint.
22
+ attr_reader :soap_endpoint
23
+
24
+ # Hook method called when the stream parser encounters a starting tag.
25
+ def tag_start(tag, attrs)
26
+ # read xml namespaces if root element
27
+ read_namespaces(attrs) if @path.empty?
28
+
29
+ tag, namespace = tag.split(":").reverse
30
+ @path << tag
31
+
32
+ if @section == :binding && tag == "binding"
33
+ # ensure that we are in an wsdl/soap namespace
34
+ @section = nil unless @namespaces[namespace].starts_with? "http://schemas.xmlsoap.org/wsdl/soap"
35
+ end
36
+
37
+ @section = tag.to_sym if Sections.include?(tag) && depth <= 2
38
+
39
+ @namespace_uri ||= attrs["targetNamespace"] if @section == :definitions
40
+ @soap_endpoint ||= URI(attrs["location"]) if @section == :service && tag == "address"
41
+
42
+ operation_from tag, attrs if @section == :binding && tag == "operation"
43
+ end
44
+
45
+ # Returns our current depth in the WSDL document.
46
+ def depth
47
+ @path.size
48
+ end
49
+
50
+ # Reads namespace definitions from a given +attrs+ Hash.
51
+ def read_namespaces(attrs)
52
+ attrs.each do |key, value|
53
+ @namespaces[key.strip_namespace] = value if key.starts_with? "xmlns:"
54
+ end
55
+ end
56
+
57
+ # Hook method called when the stream parser encounters a closing tag.
58
+ def tag_end(tag)
59
+ @path.pop
60
+
61
+ if @section == :binding && @input && tag.strip_namespace == "operation"
62
+ # no soapAction attribute found till now
63
+ operation_from tag, "soapAction" => @input
64
+ end
65
+ end
66
+
67
+ # Stores available operations from a given tag +name+ and +attrs+.
68
+ def operation_from(tag, attrs)
69
+ @input = attrs["name"] if attrs["name"]
70
+
71
+ if attrs["soapAction"]
72
+ @action = !attrs["soapAction"].blank? ? attrs["soapAction"] : @input
73
+ @input = @action.split("/").last if !@input || @input.empty?
74
+
75
+ @operations[@input.snakecase.to_sym] = { :action => @action, :input => @input }
76
+ @input, @action = nil, nil
77
+ end
78
+ end
79
+
80
+ # Catches calls to unimplemented hook methods.
81
+ def method_missing(method, *args)
82
+ end
83
+
84
+ end
85
+ end
data/lib/savon/wsse.rb CHANGED
@@ -1,24 +1,55 @@
1
1
  module Savon
2
2
 
3
- # Savon::WSSE
3
+ # = Savon::WSSE
4
4
  #
5
- # Represents parameters for WSSE authentication.
5
+ # Savon::WSSE represents WSSE authentication. Pass a block to your SOAP call and the WSSE object
6
+ # is passed to it as the second argument. The object allows setting the WSSE username, password
7
+ # and whether to use digest authentication.
8
+ #
9
+ # == Credentials
10
+ #
11
+ # By default, Savon does not use WSSE authentication. Simply specify a username and password to
12
+ # change this.
13
+ #
14
+ # response = client.get_all_users do |soap, wsse|
15
+ # wsse.username = "eve"
16
+ # wsse.password = "secret"
17
+ # end
18
+ #
19
+ # == Digest
20
+ #
21
+ # To use WSSE digest authentication, just use the digest method and set it to +true+.
22
+ #
23
+ # response = client.get_all_users do |soap, wsse|
24
+ # wsse.username = "eve"
25
+ # wsse.password = "secret"
26
+ # wsse.digest = true
27
+ # end
28
+ #
29
+ # == Default to WSSE
30
+ #
31
+ # In case all you're services require WSSE authentication, you can set your credentials and whether
32
+ # to use WSSE digest for every request:
33
+ #
34
+ # Savon::WSSE.username = "eve"
35
+ # Savon::WSSE.password = "secret"
36
+ # Savon::WSSE.digest = true
6
37
  class WSSE
7
38
 
8
39
  # Base address for WSSE docs.
9
40
  BaseAddress = "http://docs.oasis-open.org/wss/2004/01"
10
41
 
11
42
  # Namespace for WS Security Secext.
12
- WSENamespace = BaseAddress + "/oasis-200401-wss-wssecurity-secext-1.0.xsd"
43
+ WSENamespace = "#{BaseAddress}/oasis-200401-wss-wssecurity-secext-1.0.xsd"
13
44
 
14
45
  # Namespace for WS Security Utility.
15
- WSUNamespace = BaseAddress + "/oasis-200401-wss-wssecurity-utility-1.0.xsd"
46
+ WSUNamespace = "#{BaseAddress}/oasis-200401-wss-wssecurity-utility-1.0.xsd"
16
47
 
17
48
  # URI for "wsse:Password/@Type" #PasswordText.
18
- PasswordTextURI = BaseAddress + "/oasis-200401-wss-username-token-profile-1.0#PasswordText"
49
+ PasswordTextURI = "#{BaseAddress}/oasis-200401-wss-username-token-profile-1.0#PasswordText"
19
50
 
20
51
  # URI for "wsse:Password/@Type" #PasswordDigest.
21
- PasswordDigestURI = BaseAddress + "/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"
52
+ PasswordDigestURI = "#{BaseAddress}/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"
22
53
 
23
54
  # Global WSSE username.
24
55
  @@username = nil
@@ -30,8 +61,7 @@ module Savon
30
61
 
31
62
  # Sets the global WSSE username.
32
63
  def self.username=(username)
33
- @@username = username.to_s if username.respond_to? :to_s
34
- @@username = nil if username.nil?
64
+ @@username = username.nil? ? nil : username.to_s
35
65
  end
36
66
 
37
67
  # Global WSSE password.
@@ -44,8 +74,7 @@ module Savon
44
74
 
45
75
  # Sets the global WSSE password.
46
76
  def self.password=(password)
47
- @@password = password.to_s if password.respond_to? :to_s
48
- @@password = nil if password.nil?
77
+ @@password = password.nil? ? nil : password.to_s
49
78
  end
50
79
 
51
80
  # Global setting of whether to use WSSE digest.
@@ -63,8 +92,7 @@ module Savon
63
92
 
64
93
  # Sets the WSSE username per request.
65
94
  def username=(username)
66
- @username = username.to_s if username.respond_to? :to_s
67
- @username = nil if username.nil?
95
+ @username = username.nil? ? nil : username.to_s
68
96
  end
69
97
 
70
98
  # Returns the WSSE username. Defaults to the global setting.
@@ -74,8 +102,7 @@ module Savon
74
102
 
75
103
  # Sets the WSSE password per request.
76
104
  def password=(password)
77
- @password = password.to_s if password.respond_to? :to_s
78
- @password = nil if password.nil?
105
+ @password = password.nil? ? nil : password.to_s
79
106
  end
80
107
 
81
108
  # Returns the WSSE password. Defaults to the global setting.
@@ -86,13 +113,13 @@ module Savon
86
113
  # Sets whether to use WSSE digest per request.
87
114
  attr_writer :digest
88
115
 
89
- # Returns whether to use WSSE digest. Defaults to the global setting.
116
+ # Returns whether to use WSSE digest. Defaults to the global setting.
90
117
  def digest?
91
118
  @digest || self.class.digest?
92
119
  end
93
120
 
94
- # Returns the XML for a WSSE header or an empty String unless both
95
- # username and password were specified.
121
+ # Returns the XML for a WSSE header or an empty String unless both username and password
122
+ # were specified.
96
123
  def header
97
124
  return "" unless username && password
98
125
 
@@ -129,7 +156,7 @@ module Savon
129
156
 
130
157
  # Returns a WSSE timestamp.
131
158
  def timestamp
132
- @timestamp ||= Time.now.strftime Savon::SOAPDateTimeFormat
159
+ @timestamp ||= Time.now.strftime Savon::SOAP::DateTimeFormat
133
160
  end
134
161
 
135
162
  end
@@ -1,4 +1,3 @@
1
- require "rubygems"
2
1
  require "rake"
3
2
  require "spec"
4
3
  require "mocha"
@@ -5,6 +5,7 @@ class EndpointHelper
5
5
  case type
6
6
  when :no_namespace then "http://nons.example.com/Service?wsdl"
7
7
  when :namespaced_actions then "http://nsactions.example.com/Service?wsdl"
8
+ when :geotrust then "https://test-api.geotrust.com/webtrust/query.jws?WSDL"
8
9
  else soap_endpoint(type)
9
10
  end
10
11
  end
@@ -0,0 +1,156 @@
1
+ <?xml version='1.0' encoding='UTF-8'?>
2
+ <s0:definitions name="queryDefinitions" targetNamespace="http://api.geotrust.com/webtrust/query" xmlns="" xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:s1="http://api.geotrust.com/webtrust/query" xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s3="http://www.openuri.org/2006/12/wsdl/upgradedJWS">
3
+ <s0:types>
4
+ <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://api.geotrust.com/webtrust/query" xmlns:s0="http://schemas.xmlsoap.org/wsdl/" xmlns:s1="http://api.geotrust.com/webtrust/query" xmlns:s2="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s3="http://www.openuri.org/2006/12/wsdl/upgradedJWS" xmlns:xs="http://www.w3.org/2001/XMLSchema">
5
+ <xs:complexType name="GetQuickApproverListInput">
6
+ <xs:sequence>
7
+ <xs:element minOccurs="0" name="QueryRequestHeader" type="quer:queryRequestHeader" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
8
+ <xs:element minOccurs="0" name="Domain" type="xs:string"/>
9
+ <xs:element minOccurs="0" name="IncludeUserAgreement" type="quer:includeUserAgreement" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
10
+ </xs:sequence>
11
+ </xs:complexType>
12
+ <xs:complexType name="queryRequestHeader">
13
+ <xs:sequence>
14
+ <xs:element minOccurs="0" name="PartnerCode" type="xs:string"/>
15
+ <xs:element minOccurs="0" name="AuthToken" type="quer:authToken" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
16
+ <xs:element minOccurs="0" name="ReplayToken" type="xs:string"/>
17
+ <xs:element minOccurs="0" name="UseReplayToken" type="xs:boolean"/>
18
+ </xs:sequence>
19
+ </xs:complexType>
20
+ <xs:complexType name="authToken">
21
+ <xs:sequence>
22
+ <xs:element minOccurs="0" name="UserName" type="xs:string"/>
23
+ <xs:element minOccurs="0" name="Password" type="xs:string"/>
24
+ </xs:sequence>
25
+ </xs:complexType>
26
+ <xs:complexType name="includeUserAgreement">
27
+ <xs:sequence>
28
+ <xs:element minOccurs="0" name="UserAgreementProductCode" type="xs:string"/>
29
+ </xs:sequence>
30
+ </xs:complexType>
31
+ <xs:complexType name="GetUserAgreementInput">
32
+ <xs:sequence>
33
+ <xs:element minOccurs="0" name="QueryRequestHeader" type="quer:queryRequestHeader" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
34
+ <xs:element minOccurs="0" name="UserAgreementProductCode" type="xs:string"/>
35
+ </xs:sequence>
36
+ </xs:complexType>
37
+ <xs:complexType name="GetQuickApproverListOutput">
38
+ <xs:sequence>
39
+ <xs:element minOccurs="0" name="QueryResponseHeader" type="quer:queryResponseHeader" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
40
+ <xs:element minOccurs="0" name="ApproverList" type="quer:ArrayOfApprover" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
41
+ <xs:element minOccurs="0" name="UserAgreement" type="xs:string"/>
42
+ </xs:sequence>
43
+ </xs:complexType>
44
+ <xs:complexType name="queryResponseHeader">
45
+ <xs:sequence>
46
+ <xs:element name="SuccessCode" type="xs:int"/>
47
+ <xs:element minOccurs="0" name="Errors" type="quer:ArrayOfError" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
48
+ <xs:element minOccurs="0" name="Timestamp" type="xs:dateTime"/>
49
+ <xs:element name="ReturnCount" type="xs:int"/>
50
+ </xs:sequence>
51
+ </xs:complexType>
52
+ <xs:complexType name="Error">
53
+ <xs:sequence>
54
+ <xs:element name="ErrorCode" type="xs:int"/>
55
+ <xs:element minOccurs="0" name="ErrorField" type="xs:string"/>
56
+ <xs:element minOccurs="0" name="ErrorMessage" type="xs:string"/>
57
+ </xs:sequence>
58
+ </xs:complexType>
59
+ <xs:complexType name="ArrayOfError">
60
+ <xs:sequence>
61
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Error" type="quer:Error" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
62
+ </xs:sequence>
63
+ </xs:complexType>
64
+ <xs:element name="ArrayOfError" type="quer:ArrayOfError" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
65
+ <xs:complexType name="Approver">
66
+ <xs:sequence>
67
+ <xs:element minOccurs="0" name="ApproverType" type="xs:string"/>
68
+ <xs:element minOccurs="0" name="ApproverEmail" type="xs:string"/>
69
+ </xs:sequence>
70
+ </xs:complexType>
71
+ <xs:complexType name="ArrayOfApprover">
72
+ <xs:sequence>
73
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Approver" type="quer:Approver" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
74
+ </xs:sequence>
75
+ </xs:complexType>
76
+ <xs:element name="ArrayOfApprover" type="quer:ArrayOfApprover" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
77
+ <xs:complexType name="ArrayOfString">
78
+ <xs:sequence>
79
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="String" type="xs:string"/>
80
+ </xs:sequence>
81
+ </xs:complexType>
82
+ <xs:element name="ArrayOfString" type="quer:ArrayOfString" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
83
+ <xs:element name="GetQuickApproverList">
84
+ <xs:complexType>
85
+ <xs:sequence>
86
+ <xs:element minOccurs="0" name="Request" type="quer:GetQuickApproverListInput" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
87
+ </xs:sequence>
88
+ </xs:complexType>
89
+ </xs:element>
90
+ <xs:element name="GetQuickApproverListResponse">
91
+ <xs:complexType>
92
+ <xs:sequence>
93
+ <xs:element minOccurs="0" name="GetQuickApproverListResult" type="quer:GetQuickApproverListOutput" xmlns:quer="http://api.geotrust.com/webtrust/query"/>
94
+ </xs:sequence>
95
+ </xs:complexType>
96
+ </xs:element>
97
+ <xs:element name="hello">
98
+ <xs:complexType>
99
+ <xs:sequence>
100
+ <xs:element minOccurs="0" name="Input" type="xs:string"/>
101
+ </xs:sequence>
102
+ </xs:complexType>
103
+ </xs:element>
104
+ <xs:element name="helloResponse">
105
+ <xs:complexType>
106
+ <xs:sequence>
107
+ <xs:element minOccurs="0" name="helloResult" type="xs:string"/>
108
+ </xs:sequence>
109
+ </xs:complexType>
110
+ </xs:element>
111
+ </xs:schema>
112
+ </s0:types>
113
+ <s0:message name="hello">
114
+ <s0:part element="s1:hello" name="parameters"/>
115
+ </s0:message>
116
+ <s0:message name="helloResponse">
117
+ <s0:part element="s1:helloResponse" name="helloResultPart"/>
118
+ </s0:message>
119
+ <s0:portType name="querySoap">
120
+ <s0:operation name="GetQuickApproverList" parameterOrder="parameters">
121
+ <s0:input message="s1:GetQuickApproverList"/>
122
+ <s0:output message="s1:GetQuickApproverListResponse"/>
123
+ </s0:operation>
124
+ <s0:operation name="hello" parameterOrder="parameters">
125
+ <s0:input message="s1:hello"/>
126
+ <s0:output message="s1:helloResponse"/>
127
+ </s0:operation>
128
+ </s0:portType>
129
+ <s0:binding name="querySoapBinding" type="s1:querySoap">
130
+ <s2:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
131
+ <s0:operation name="GetQuickApproverList">
132
+ <s2:operation style="document"/>
133
+ <s0:input>
134
+ <s2:body parts="parameters" use="literal"/>
135
+ </s0:input>
136
+ <s0:output>
137
+ <s2:body parts="GetQuickApproverListResultPart" use="literal"/>
138
+ </s0:output>
139
+ </s0:operation>
140
+ <s0:operation name="hello">
141
+ <s2:operation style="document"/>
142
+ <s0:input>
143
+ <s2:body parts="parameters" use="literal"/>
144
+ </s0:input>
145
+ <s0:output>
146
+ <s2:body parts="helloResultPart" use="literal"/>
147
+ </s0:output>
148
+ </s0:operation>
149
+ </s0:binding>
150
+ <s0:service name="query">
151
+ <s3:upgraded81/>
152
+ <s0:port binding="s1:querySoapBinding" name="querySoap">
153
+ <s2:address location="https://test-api.geotrust.com:443/webtrust/query.jws"/>
154
+ </s0:port>
155
+ </s0:service>
156
+ </s0:definitions>